From 49a9b8e84171be07a4a975741529aca2a840c386 Mon Sep 17 00:00:00 2001 From: BaronJHYu <254878848@qq.com> Date: Wed, 21 Sep 2022 01:57:46 +0800 Subject: [PATCH 001/280] Update mediago.md (#4024) Update module support param key from PbCommonId to SharedID. --- dev-docs/bidders/mediago.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/dev-docs/bidders/mediago.md b/dev-docs/bidders/mediago.md index 77738db469..238a6ba6d9 100644 --- a/dev-docs/bidders/mediago.md +++ b/dev-docs/bidders/mediago.md @@ -10,7 +10,7 @@ pbjs_version_notes: not ported to 5.x, added back 7.13 --- ### Modules -pubCommonId.js: We need you to include pubCommonId.js module,which is used to get prebid user commonid.It can better differentiating users to bid on ads. +SharedID: We need you to include SharedID module,which is used to get prebid user commonid.It can better differentiating users to bid on ads. ### Note: From c91bbcf30c20bd6b4d3abe72fa4d35f15ccc0662 Mon Sep 17 00:00:00 2001 From: carodaio <110619753+carodaio@users.noreply.github.com> Date: Tue, 20 Sep 2022 20:00:37 +0200 Subject: [PATCH 002/280] Caroda: Prebid initial adapter release documentation (#3960) * added documentation file * added more information Co-authored-by: Ioan-Carol Plangu --- dev-docs/bidders/caroda.md | 49 ++++++++++++++++++++++++++++++++++++++ 1 file changed, 49 insertions(+) create mode 100644 dev-docs/bidders/caroda.md diff --git a/dev-docs/bidders/caroda.md b/dev-docs/bidders/caroda.md new file mode 100644 index 0000000000..288b122b27 --- /dev/null +++ b/dev-docs/bidders/caroda.md @@ -0,0 +1,49 @@ +--- +layout: bidder +title: Caroda +description: Prebid Caroda Bidder Adaptor +biddercode: caroda +media_types: banner, video +coppa_supported: true +gdpr_supported: true +usp_supported: true +prebid_member: false +pbjs: true +pbs: false +schain_supported: true +userIds: all +gvl_id: 954 +floors_supported: true +multiformat_supported: will-bid-on-any, will-bid-on-one +fpd_supported: true +safeframes_ok: true +ortb_blocking_supported: false +deals_supported: false +--- + +### Bid params + +The Caroda Bidding adapter requires setup before beginning. Please contact us on https://caroda.io/ + +{: .table .table-bordered .table-striped } +| Name | Scope | Description | Example | Type | +|---------------|----------------------------|-----------------------------------------------------------------|-------------------|-----------| +| `ctok` | required | id unique to a customer | `"abcdef"` | `string` | +| `placementId` | optional | used when there are multiple placements configured per domain | `"opzabc123"` | `string` | +| `priceType` | optional | price type | `"gross"` | `string` | + + + +### OpenRTB request config + +OpenRTB bid request `app`, `site`, `device` properties configured using prebid config. + +``` javascript +pbjs.setConfig({ + ortb2: { + app: { + name: 'My APP' + } + } +}); +``` From 85d8ecf20773a227907931cabccc3bc661f55b2f Mon Sep 17 00:00:00 2001 From: Mikhail Ivanchenko Date: Tue, 20 Sep 2022 21:16:08 +0300 Subject: [PATCH 003/280] added video as supported media type (#3978) --- dev-docs/bidders/nextMillennium.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/dev-docs/bidders/nextMillennium.md b/dev-docs/bidders/nextMillennium.md index 5aa72fdf2e..4013e3d12f 100644 --- a/dev-docs/bidders/nextMillennium.md +++ b/dev-docs/bidders/nextMillennium.md @@ -14,7 +14,7 @@ pbs_app_supported: false pbjs: true pbs: true biddercode: nextMillennium -media_types: banner +media_types: banner, video description: NextMillennium bid adapter --- From d60ad754661410ab1a457a7e86a3f9fc90750ade Mon Sep 17 00:00:00 2001 From: nkloeber <100145701+nkloeber@users.noreply.github.com> Date: Tue, 20 Sep 2022 20:38:59 +0200 Subject: [PATCH 004/280] Yieldlab remove unsupported adSize bid parameter (#3992) --- dev-docs/bidders/yieldlab.md | 1 - 1 file changed, 1 deletion(-) diff --git a/dev-docs/bidders/yieldlab.md b/dev-docs/bidders/yieldlab.md index 32644d6782..c24215f353 100644 --- a/dev-docs/bidders/yieldlab.md +++ b/dev-docs/bidders/yieldlab.md @@ -21,7 +21,6 @@ pbs: true |----------------|----------|---------------------------------------------------------------------------------------|---------------------------------------------|----------| | `adslotId` | required | Yieldlab Adslot ID | `'12345'` | `string` | | `supplyId` | required | Yieldlab Supply ID. Please reach out to your account management for more information. | `'12345'` | `string` | -| `adSize` | optional | Override the default prebid size | `'970x250'` | `string` | | `targeting` | optional | Key-Value Targeting | `{ 'key1': 'value1', 'key2': 'value2' }` | `object` | | `extId` | optional | External Id | `'abc'` | `string` | | `iabContent` | optional | Object of content information, see [IAB Content Object](#iab_content) for details. It will override the content object passed in [First Party Data](https://docs.prebid.org/features/firstPartyData.html) | `{ 'id': 'foo', 'title': 'bar' }` | `object` | From f82518c69791c56674096a33929aa2a3b0f16146 Mon Sep 17 00:00:00 2001 From: bretg Date: Wed, 21 Sep 2022 09:03:30 -0400 Subject: [PATCH 005/280] added adunitcode to PBS extension list (#4031) --- prebid-server/endpoints/openrtb2/pbs-endpoint-auction.md | 1 + 1 file changed, 1 insertion(+) diff --git a/prebid-server/endpoints/openrtb2/pbs-endpoint-auction.md b/prebid-server/endpoints/openrtb2/pbs-endpoint-auction.md index d5b4e0e30c..bb0f534d17 100644 --- a/prebid-server/endpoints/openrtb2/pbs-endpoint-auction.md +++ b/prebid-server/endpoints/openrtb2/pbs-endpoint-auction.md @@ -1505,6 +1505,7 @@ The Prebid SDK version comes from: | ext.prebid.no-sale | turns off CCPA processing for the named bidder(s).
ex: `["bidderA"]` | array of strings | no | | ext.prebid.server | additional Prebid Server metadata | object | yes | | ext.prebid.floors | PBS floors data | object | no | +| imp.ext.prebid.adunitcode | Prebid.js adunit code | string | yes | #### Response {:.no_toc} From dccf25d0a67f51538e3af8f1b66a55f559e2123d Mon Sep 17 00:00:00 2001 From: bretg Date: Wed, 21 Sep 2022 09:09:18 -0400 Subject: [PATCH 006/280] appnexus version note (#4033) --- dev-docs/bidders/appnexus.md | 1 + 1 file changed, 1 insertion(+) diff --git a/dev-docs/bidders/appnexus.md b/dev-docs/bidders/appnexus.md index 9872ea41f0..64dabbe329 100644 --- a/dev-docs/bidders/appnexus.md +++ b/dev-docs/bidders/appnexus.md @@ -13,6 +13,7 @@ usp_supported: true floors_supported: true fpd_supported: true pbjs: true +pbjs_version_notes: please avoid using v7.15 and v7.16 pbs: true gvl_id: 32 --- From 889e95eb7c235a905ac3ab1ab2cbfb25fba16e0f Mon Sep 17 00:00:00 2001 From: bretg Date: Wed, 21 Sep 2022 11:34:14 -0400 Subject: [PATCH 007/280] PBS endpoint: added trace option (#4034) --- .../endpoints/openrtb2/pbs-endpoint-auction.md | 14 +++++++++++++- 1 file changed, 13 insertions(+), 1 deletion(-) diff --git a/prebid-server/endpoints/openrtb2/pbs-endpoint-auction.md b/prebid-server/endpoints/openrtb2/pbs-endpoint-auction.md index bb0f534d17..bd4872a181 100644 --- a/prebid-server/endpoints/openrtb2/pbs-endpoint-auction.md +++ b/prebid-server/endpoints/openrtb2/pbs-endpoint-auction.md @@ -763,6 +763,17 @@ The OpenRTB `test` flag has a special meaning that bidders may react to: they ma You can turn on the extra Prebid Server debug log without the formal `test` behavior by instead setting `ext.prebid.debug: true`. +##### Trace Flag + +{: .alert.alert-info :} +PBS-Java only + +You can turn on additional Prebid Server tracing by setting `ext.prebid.trace` to either "verbose" or "basic". +This provides additional information for certain scenarios: + +- for [modules](/prebid-server/pbs-modules/), look in response ext.prebid.modules.trace +- for [PG](/prebid-server/features/pg/pbs-pg-idx.html), look in response ext.debug.trace + ##### Stored Responses While testing SDK and video integrations, it's important, but often difficult, to get consistent responses back from bidders that cover a range of scenarios like different CPM values, deals, etc. Prebid Server supports a debugging workflow in two ways: @@ -1494,7 +1505,8 @@ The Prebid SDK version comes from: | ext.prebid.currency.usepbsrates | if true, currency.rates is used as a backup if dynamic rates aren't found. If false, dynamic rates are not used.
ex: `true` | boolean | yes | | ext.prebid.data.bidders | bidders in scope for bidder-specific first party data, see [first party data](/prebid-server/endpoints/openrtb2/pbs-endpoint-auction.html#first-party-data-support). | array of strings | no | | ext.prebid.data.eidpermissions | Allows publishers to define which bidders are allowed to see which extended IDs, see [eid permissions](/prebid-server/endpoints/openrtb2/pbs-endpoint-auction.html#eid-permissions) | object | no | -| ext.prebid.debug | Provides debug output in response.
ex: `true` | boolean | yes | +| ext.prebid.debug | Provides debug output in response. | boolean | yes | +| ext.prebid.trace | Provides trace output in response. | "verbose" or "basic" | yes | | ext.prebid.events | Enables VAST impression tracking injection for the request when an empty object is provided. This is an alernative method from using account configuration. | object | no | ext.prebid.experimentadscert.enabled | Enabled Ads.Cert 2.0 Authenticated Connections on supported outgoing bidder requests. | boolean | no | | ext.prebid.integration | host-dependent integration type passed through to events and analytics.
ex: `"managed"` | string | yes | From acd66562267b529251a80d4c0d03485bd0b03ce8 Mon Sep 17 00:00:00 2001 From: Olivier Date: Thu, 22 Sep 2022 14:28:07 +0200 Subject: [PATCH 008/280] Adagio: update FPD note (#4025) --- dev-docs/bidders/adagio.md | 8 +++++++- 1 file changed, 7 insertions(+), 1 deletion(-) diff --git a/dev-docs/bidders/adagio.md b/dev-docs/bidders/adagio.md index 14e0bc092e..da650672c3 100644 --- a/dev-docs/bidders/adagio.md +++ b/dev-docs/bidders/adagio.md @@ -63,4 +63,10 @@ pbjs.bidderSettings = { ### First Party Data -Adagio does not support FPD for now. It will be added soon. +Adagio will use FPD data as fallback for the params below: +- pagetype +- environment +- category +- subcategory + +If the FPD value is an array, the 1st value of this array will be used. From 58f4307a47761702c5ee8b3e69b9d36eaf4e88e6 Mon Sep 17 00:00:00 2001 From: Veronika Solovei Date: Thu, 22 Sep 2022 05:29:02 -0700 Subject: [PATCH 009/280] Adapter configuration update (#4008) * Modified the document to keep it up to date with new changes in adapter configuration * Minor refactoring Co-authored-by: vsolovei --- prebid-server/developers/add-new-bidder-go.md | 62 +++++++++++-------- 1 file changed, 35 insertions(+), 27 deletions(-) diff --git a/prebid-server/developers/add-new-bidder-go.md b/prebid-server/developers/add-new-bidder-go.md index 03cbd17480..2e0e243289 100644 --- a/prebid-server/developers/add-new-bidder-go.md +++ b/prebid-server/developers/add-new-bidder-go.md @@ -76,6 +76,7 @@ Let's begin with your adapter's bidder information YAML file. This file is requi Create a file with the path `static/bidder-info/{bidder}.yaml` and begin with the following template: ```yaml +endpoint: "http://foo.com/openrtb2" maintainer: email: prebid-maintainer@example.com endpointCompression: gzip @@ -106,12 +107,15 @@ Modify this template for your bid adapter: - Change the `gvlVendorID` from the sample value of `42` to the id of your bidding server as registered with the [GDPR Global Vendor List (GVL)](https://iabeurope.eu/vendor-list-tcf-v2-0/), or remove this line entirely if your bidding server is not registered with IAB Europe. - Change the `modifyingVastXmlAllowed` value to `false` if you'd like to opt-out of [video impression tracking](https://github.com/prebid/prebid-server/issues/1015), or remove this line entirely if your adapter doesn't support VAST video ads. - Remove the `capabilities` (app/site) and `mediaTypes` (banner/video/audio/native) combinations which your adapter does not support. +- Add the `extra_info` if you'd like to pass extra value adapter may need. +- Add the `disabled` flag and set it to true if you would like to unregister adapter from the core. It's enabled by default. - Follow the [User Sync Configuration](#user-sync-configuration) documentation below to configure the endpoints for your bid adapter, or remove the `userSync` section if not supported.
Example: Website with banner ads only. ```yaml +endpoint: "http://foo.com/openrtb2" maintainer: email: foo@foo.com gvlVendorID: 42 @@ -130,6 +134,7 @@ userSync: Example: Website with banner ads only and not registered with IAB Europe. ```yaml +endpoint: "http://foo.com/openrtb2" maintainer: email: foo@foo.com capabilities: @@ -147,6 +152,7 @@ userSync: Example: Website or app with banner or video ads and video impression tracking. ```yaml +endpoint: "http://foo.com/openrtb2" maintainer: email: foo@foo.com gvlVendorID: 42 @@ -166,6 +172,35 @@ userSync: userMacro: $UID ```
+ +
+ Example: Extra info with json data. + +```yaml +endpoint: "http://foo.com/openrtb2" +extra_info: "{\"foo\":\"bar\"}" +maintainer: + email: foo@foo.com +gvlVendorID: 42 +capabilities: + site: + mediaTypes: + - banner +userSync: + redirect: + url: https://foo.com/sync?gdpr={%raw%}{{.GDPR}}{%endraw%}&consent={%raw%}{{.GDPRConsent}}{%endraw%}&us_privacy={%raw%}{{.USPrivacy}}{%endraw%}&redirect={%raw%}{{.RedirectURL}}{%endraw%} + userMacro: $UID +``` +
+ +
+ Example: Disable the adapter. + +```yaml +endpoint: "http://foo.com/openrtb2" +disabled: true +``` +

#### User Sync Configuration @@ -883,31 +918,6 @@ You need to provide default settings for your bid adapter. You can decide if you {: .alert.alert-warning :} **HOST SPECIFIC INFO:** The default endpoint must not be specific to any particular host, such as Xandr/AppNexus. We may ask you about suspicious looking ids during the review process. Please reach out to individual hosts if you need to set specialized configuration. -#### Enabled By Default - -Edit the file `config/config.go` to register your default endpoint within the `SetupViper` method. If your bid adapter makes use of extra adapter info and you'd like to provide a good default value, you can do that here too. - -```go -func SetupViper(v *viper.Viper, filename string) { - ... - v.SetDefault("adapters.{bidder}.endpoint", "https://your.url/any/path") - v.SetDefault("adapters.{bidder}.extra_info", `{"your": "extra info"}`) - ... -} -``` - -#### Disabled By Default - -Edit the file `config/config.go` to register your default endpoint within the `SetupViper` method. You may still provide a default endpoint or extra adapter info. - -```go -func SetupViper(v *viper.Viper, filename string) { - ... - v.SetDefault("adapters.{bidder}.disabled", "true") - ... -} -``` - ## Test Your Adapter This section will guide you through the creation of automated unit tests to cover your bid adapter code and bidder parameters JSON Schema. We use GitHub Action Workflows to ensure the code you submit passes validation. You can run the same validation locally with this command: @@ -1227,8 +1237,6 @@ Notes on the metadata fields: - Register With The Core - `openrtb_ext/bidders.go` - `exchange/adapter_builders.go` -- Defaults - - `config/config.go` ## Contribute From e30b80cc72e201b9da592ee3b90f57a7b91061b6 Mon Sep 17 00:00:00 2001 From: Demetrio Girardi Date: Thu, 22 Sep 2022 06:30:52 -0600 Subject: [PATCH 010/280] Prebid core: document new `performanceMetrics` config (#4015) * Prebid core: document new `performanceMetrics` config * add too Co-authored-by: Chris Huie --- dev-docs/publisher-api-reference/setConfig.md | 13 ++++++++++++- 1 file changed, 12 insertions(+), 1 deletion(-) diff --git a/dev-docs/publisher-api-reference/setConfig.md b/dev-docs/publisher-api-reference/setConfig.md index 32cc79b198..bdd6d62a96 100644 --- a/dev-docs/publisher-api-reference/setConfig.md +++ b/dev-docs/publisher-api-reference/setConfig.md @@ -34,6 +34,7 @@ Core config: + [First Party Data](#setConfig-fpd) + [Caching VAST XML](#setConfig-vast-cache) + [Site Metadata](#setConfig-site) ++ [Disable performance metrics](#setConfig-performanceMetrics) + [Generic Configuration](#setConfig-Generic-Configuration) + [Troubleshooting configuration](#setConfig-Troubleshooting-your-configuration) @@ -1277,8 +1278,18 @@ Notes: - The only time `waitForIt` means anything is if some modules are flagged as true and others as false. If all modules are the same (true or false), it has no effect. - Likewise, `waitForIt` doesn't mean anything without an auctionDelay specified. - + + +#### Disable performance metrics + +Since version 7.17, Prebid collects fine-grained performance metrics and attaches them to several events for the purpose of analytics. If you find that this generates too much data for your analytics provider you may disable this feature with: + +``` +pbjs.setConfig({performanceMetrics: false}) +``` + + #### Generic setConfig Configuration Some adapters may support other options, as defined in their documentation. To set arbitrary configuration values: From a1a80aa436659edbd09b5ae951380a92620ace6f Mon Sep 17 00:00:00 2001 From: bretg Date: Thu, 22 Sep 2022 10:48:41 -0400 Subject: [PATCH 011/280] mobileResize note (#4035) --- adops/send-all-bids-adops.md | 8 +++----- 1 file changed, 3 insertions(+), 5 deletions(-) diff --git a/adops/send-all-bids-adops.md b/adops/send-all-bids-adops.md index 19129ea43a..40cde317c2 100644 --- a/adops/send-all-bids-adops.md +++ b/adops/send-all-bids-adops.md @@ -111,12 +111,10 @@ Next, add a creative to this $0.50 line item; we will duplicate the creative lat ``` -{% capture noteAlert %} -Replace the *BIDDERCODE* placeholders in the above template with the appropriate bidder your line item is targeting. For example, if you're targeting the bidder *appnexus*, the macro variable for `adId` would look like `ucTagData.adId = "%%PATTERN:hb_adid_appnexus%%";`. IMPORTANT: Make sure that none of the values are -longer than 20 characters. e.g. you'll need to truncate hb_cache_host_triplelift to hb_cache_host_triple. GAM doesn't support attributes longer than 20 chars, so all Prebid software truncates attributes to that length. -{% endcapture %} +{: .alert.alert-info :} +- Replace the *BIDDERCODE* placeholders in the above template with the appropriate bidder your line item is targeting. For example, if you're targeting the bidder *appnexus*, the macro variable for `adId` would look like `ucTagData.adId = "%%PATTERN:hb_adid_appnexus%%";`. IMPORTANT: Make sure that none of the values are longer than 20 characters. e.g. you'll need to truncate hb_cache_host_triplelift to hb_cache_host_triple. GAM doesn't support attributes longer than 20 chars, so all Prebid software truncates attributes to that length. +- The attribute name of `mobileResize` isn't important, just the value. The Prebid SDK scans this code explicitly for "hb_size". -{% include alerts/alert_note.html content=noteAlert %} ![New creative]({{ site.github.url }}/assets/images/demo-setup/new-creative.png){: .pb-lg-img :} From def965cb736d5657da67be3506ffa01bebbff096 Mon Sep 17 00:00:00 2001 From: bretg Date: Fri, 23 Sep 2022 12:51:46 -0400 Subject: [PATCH 012/280] Remove FPD flag from TTD adapter (#4037) Spoke with @julian-burger-ttd - the plan is they'll add a section to the doc detailing which first party data fields are supported, then the flag can be re-added. --- dev-docs/bidders/ttd.md | 1 - 1 file changed, 1 deletion(-) diff --git a/dev-docs/bidders/ttd.md b/dev-docs/bidders/ttd.md index b17d1d818b..ad7524743c 100644 --- a/dev-docs/bidders/ttd.md +++ b/dev-docs/bidders/ttd.md @@ -12,7 +12,6 @@ dchain_supported: false userIds: unifiedId, uid2 media_types: banner, video floors_supported: true -fpd_supported: true pbjs: true pbs: false prebid_member: true From 8cda36786d378d4556abf4ca0b7f142a311862bc Mon Sep 17 00:00:00 2001 From: bretg Date: Fri, 23 Sep 2022 13:16:44 -0400 Subject: [PATCH 013/280] added member flag to nextmillennium (#4038) --- dev-docs/bidders/nextMillennium.md | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/dev-docs/bidders/nextMillennium.md b/dev-docs/bidders/nextMillennium.md index 4013e3d12f..c7f7361af4 100644 --- a/dev-docs/bidders/nextMillennium.md +++ b/dev-docs/bidders/nextMillennium.md @@ -1,6 +1,7 @@ --- layout: bidder title: NextMillennium +description: NextMillennium bid adapter gdpr_supported: true usp_supported: true coppa_supported: false @@ -15,10 +16,10 @@ pbjs: true pbs: true biddercode: nextMillennium media_types: banner, video -description: NextMillennium bid adapter +prebid_member: true --- -### bid params +### Bid Params {: .table .table-bordered .table-striped } | Name | Scope | Description | Example | Type | From 96c8063df0fe3f4268ad4d26625d7d6720a071b5 Mon Sep 17 00:00:00 2001 From: Muki Seiler Date: Mon, 26 Sep 2022 15:14:53 +0200 Subject: [PATCH 014/280] Add multiformat_supported for Criteo (#4036) --- dev-docs/bidders/criteo.md | 1 + 1 file changed, 1 insertion(+) diff --git a/dev-docs/bidders/criteo.md b/dev-docs/bidders/criteo.md index 7426d51283..f548a3a4d6 100644 --- a/dev-docs/bidders/criteo.md +++ b/dev-docs/bidders/criteo.md @@ -15,6 +15,7 @@ fpd_supported: true schain_supported: true gvl_id: 91 coppa_supported: true +multiformat_supported: will-bid-on-any --- ### Notes From bda0b479c5ed57be822a570f4472ce4cb95e11be Mon Sep 17 00:00:00 2001 From: Chris Huie Date: Tue, 27 Sep 2022 10:01:57 -0600 Subject: [PATCH 015/280] Remove Floc from docs (#4044) * update pixfuture * take out floc * take out floc * take out floc * take out floc * take out floc * take out description * take out floc * take out floc * take out floc * take floc from download --- dev-docs/bidders/appnexus.md | 2 +- dev-docs/bidders/big-richmedia.md | 2 +- dev-docs/bidders/cwire.md | 2 +- dev-docs/bidders/goldbach.md | 2 +- dev-docs/bidders/oftmedia.md | 2 +- dev-docs/bidders/openx.md | 2 +- dev-docs/bidders/pixfuture.md | 2 +- dev-docs/bidders/winr.md | 2 +- dev-docs/modules/userId.md | 27 +-------------------------- download.md | 3 --- 10 files changed, 9 insertions(+), 37 deletions(-) diff --git a/dev-docs/bidders/appnexus.md b/dev-docs/bidders/appnexus.md index 64dabbe329..a257af2ce9 100644 --- a/dev-docs/bidders/appnexus.md +++ b/dev-docs/bidders/appnexus.md @@ -6,7 +6,7 @@ biddercode: appnexus media_types: banner, video, native gdpr_supported: true prebid_member: true -userIds: criteo, flocId, identityLink, netId, pubProvidedId, uid2, unifiedId, +userIds: criteo, identityLink, netId, pubProvidedId, uid2, unifiedId, schain_supported: true coppa_supported: true usp_supported: true diff --git a/dev-docs/bidders/big-richmedia.md b/dev-docs/bidders/big-richmedia.md index 8c2d6917df..ea82cb098b 100644 --- a/dev-docs/bidders/big-richmedia.md +++ b/dev-docs/bidders/big-richmedia.md @@ -5,7 +5,7 @@ description: Prebid Big Richmedia Bidder Adapter biddercode: big-richmedia pbjs: true media_types: banner, video -userIds: criteo, unifiedId, netId, identityLink, flocId, uid2 +userIds: criteo, unifiedId, netId, identityLink, uid2 schain_supported: true coppa_supported: true usp_supported: true diff --git a/dev-docs/bidders/cwire.md b/dev-docs/bidders/cwire.md index 8c45b82d18..7f4de1df7d 100644 --- a/dev-docs/bidders/cwire.md +++ b/dev-docs/bidders/cwire.md @@ -7,7 +7,7 @@ biddercode: cwire gdpr_supported: false usp_supported: false schain_supported: false -userIds: flocId, uid2Id +userIds: uid2Id enable_download: true media_types: banner, video --- diff --git a/dev-docs/bidders/goldbach.md b/dev-docs/bidders/goldbach.md index 6f9b4f7fc5..a275c3f09f 100644 --- a/dev-docs/bidders/goldbach.md +++ b/dev-docs/bidders/goldbach.md @@ -6,7 +6,7 @@ biddercode: goldbach media_types: banner, video, native gdpr_supported: true prebid_member: true -userIds: criteo, unifiedId, netId, identityLink, flocId, uid2 +userIds: criteo, unifiedId, netId, identityLink, uid2 schain_supported: true coppa_supported: true usp_supported: true diff --git a/dev-docs/bidders/oftmedia.md b/dev-docs/bidders/oftmedia.md index 4af214c00f..67a0274841 100644 --- a/dev-docs/bidders/oftmedia.md +++ b/dev-docs/bidders/oftmedia.md @@ -12,7 +12,7 @@ pbs: false schain_supported: true media_types: banner, video, native prebid_member: true -userIds: criteo, flocId, identityLink, netId, pubProvidedId, uid2, unifiedId, +userIds: criteo, identityLink, netId, pubProvidedId, uid2, unifiedId, floors_supported: true fpd_supported: true gvl_id: 32 diff --git a/dev-docs/bidders/openx.md b/dev-docs/bidders/openx.md index 71b7cc65e9..64149b1255 100644 --- a/dev-docs/bidders/openx.md +++ b/dev-docs/bidders/openx.md @@ -11,7 +11,7 @@ gdpr_supported: true usp_supported: true coppa_supported: true floors_supported: true -userIds: admixerId, adtelligentId, amxId, britepoolId, criteo, dapId, deepintentId, dmdId, fabrickId, flocId, hadronId, id5Id, identityLink, idxId, imuId, intentIqId, kinessoId, liveIntentId, lotamePanoramaId, merkleId, mwOpenLinkId, naveggId, netId, novatiq, parrableId, pubCommonId, publinkId, quantcastId, sharedId, tapadId, uid2, unifiedId, verizonMediaId, zeotapIdPlus +userIds: admixerId, adtelligentId, amxId, britepoolId, criteo, dapId, deepintentId, dmdId, fabrickId, hadronId, id5Id, identityLink, idxId, imuId, intentIqId, kinessoId, liveIntentId, lotamePanoramaId, merkleId, mwOpenLinkId, naveggId, netId, novatiq, parrableId, pubCommonId, publinkId, quantcastId, sharedId, tapadId, uid2, unifiedId, verizonMediaId, zeotapIdPlus prebid_member: true fpd_supported: true gvl_id: 69 diff --git a/dev-docs/bidders/pixfuture.md b/dev-docs/bidders/pixfuture.md index c718b385dc..3f57807b89 100644 --- a/dev-docs/bidders/pixfuture.md +++ b/dev-docs/bidders/pixfuture.md @@ -8,7 +8,7 @@ gdpr_supported: true prebid_member: false coppa_supported: true usp_supported: true -userIds: flocId, criteoId, unifiedId, id5Id, sharedId, identityLink, liveIntentId, fabrickId +userIds: criteoId, unifiedId, id5Id, sharedId, identityLink, liveIntentId, fabrickId pbs: false pbjs: true --- diff --git a/dev-docs/bidders/winr.md b/dev-docs/bidders/winr.md index 09a514acd2..a6157dc445 100644 --- a/dev-docs/bidders/winr.md +++ b/dev-docs/bidders/winr.md @@ -5,7 +5,7 @@ description: Prebid WINR Bidder Adaptor biddercode: winr media_types: banner prebid_member: false -userIds: criteo, unifiedId, netId, identityLink, flocId, uid2 +userIds: criteo, unifiedId, netId, identityLink, uid2 schain_supported: true coppa_supported: true usp_supported: true diff --git a/dev-docs/modules/userId.md b/dev-docs/modules/userId.md index c53b58772c..9eecfe85cc 100644 --- a/dev-docs/modules/userId.md +++ b/dev-docs/modules/userId.md @@ -89,7 +89,7 @@ The table below has the options that are common across ID systems. See the secti {: .table .table-bordered .table-striped } | Param under userSync.userIds[] | Scope | Type | Description | Example | | --- | --- | --- | --- | --- | -| name | Required | String | May be: `"33acrossId"`, `"admixerId"`, `"qid"`, `"adtelligentId"`, `"amxId"`, `"britepoolId"`, `"criteo"`, `"fabrickId"`, `"flocId"`, `"hadronId"`, `"id5id"`, `identityLink`, `"idx"`, `"intentIqId"`, `"justId"`, `"liveIntentId"`, `"lotamePanoramaId"`, `"merkleId"`, `"naveggId"`, `"mwOpenLinkId"`, `"netId"`, `"novatiqId"`, `"parrableId"`, `"quantcastId"`, `"pubProvidedId"`, `"sharedId"`, `"tapadId"`, `"unifiedId"`,`"uid2"`, `"verizonMediaId"`, `"zeotapIdPlus"` | `"unifiedId"` +| name | Required | String | May be: `"33acrossId"`, `"admixerId"`, `"qid"`, `"adtelligentId"`, `"amxId"`, `"britepoolId"`, `"criteo"`, `"fabrickId"`, `"hadronId"`, `"id5id"`, `identityLink`, `"idx"`, `"intentIqId"`, `"justId"`, `"liveIntentId"`, `"lotamePanoramaId"`, `"merkleId"`, `"naveggId"`, `"mwOpenLinkId"`, `"netId"`, `"novatiqId"`, `"parrableId"`, `"quantcastId"`, `"pubProvidedId"`, `"sharedId"`, `"tapadId"`, `"unifiedId"`,`"uid2"`, `"verizonMediaId"`, `"zeotapIdPlus"` | `"unifiedId"` | params | Based on User ID sub-module | Object | | | | bidders | Optional | Array of Strings | An array of bidder codes to which this user ID may be sent. | `['bidderA', 'bidderB']` | | storage | Optional | Object | The publisher can specify some kind of local storage in which to store the results of the call to get the user ID. This can be either cookie or HTML5 storage. This is not needed when `value` is specified or the ID system is managing its own storage | | @@ -704,31 +704,6 @@ JmZWF0dXJlIjoiSW50ZXJlc3RDb2hvcnRBUEkiLCJleHBpcnkiOjE2MjYyMjA3OTksImlzU 3ViZG9tYWluIjp0cnVlLCJpc1RoaXJkUGFydHkiOnRydWV9 -#### FLoC ID Configuration - -{: .table .table-bordered .table-striped } -| Param under userSync.userIds[] | Scope | Type | Description | Example | -| --- | --- | --- | --- | --- | -| name | Required | String | The name of this module. | `"flocId"` | -| params | Required | Object | Container of all module params. | | -| params.token | Required | String | This is your apiKey as provided by Chrome. This value is required during the origin trial phase but will be optional once the origin trial ends. Publishers may use sharedid's registered token if they choose. | `A3dHTSo...`| - -#### FLoC Example - -{% highlight javascript %} -pbjs.setConfig({ - userSync: { - userIds: [{ - name: "flocId", - params: { - "token": "Registered token" // see above for sharedId's FLoC token - } - }], - syncDelay: 3000 // 3 seconds after the first auction - } -}); -{% endhighlight %} - ### FTrack ID from Flashtalking By Mediaocean The FTrack Identity Framework (["FTrack"](https://www.flashtalking.com/identity-framework#FTrack)) User ID Module allows publishers to take advantage of Flashtalking's FTrack ID during the bidding process. diff --git a/download.md b/download.md index 86d097300a..f02ac36a1b 100644 --- a/download.md +++ b/download.md @@ -278,9 +278,6 @@ These modules may require accounts with a service provider.
- -
-
From b6023504131254fb6f66c1ad6081b618c92cfe15 Mon Sep 17 00:00:00 2001 From: Chris Huie Date: Tue, 27 Sep 2022 10:02:30 -0600 Subject: [PATCH 016/280] remove out of date notes (#4042) --- dev-docs/bidders/e_volution.md | 1 - dev-docs/bidders/ias.md | 1 - dev-docs/bidders/iprom.md | 1 - dev-docs/bidders/luponmedia.md | 1 - dev-docs/bidders/missena.md | 1 - dev-docs/bidders/open8.md | 1 - dev-docs/bidders/optimera.md | 1 - dev-docs/bidders/outbrain.md | 1 - dev-docs/bidders/smartx.md | 1 - dev-docs/bidders/talkads.md | 1 - dev-docs/bidders/turktelekom.md | 1 - dev-docs/bidders/vibrantmedia.md | 1 - 12 files changed, 12 deletions(-) diff --git a/dev-docs/bidders/e_volution.md b/dev-docs/bidders/e_volution.md index 0a0da06563..93e05493d5 100644 --- a/dev-docs/bidders/e_volution.md +++ b/dev-docs/bidders/e_volution.md @@ -11,7 +11,6 @@ pbs: true pbs_app_supported: true usp_supported: true schain_supported: true -pbjs_version_notes: in 6.8+ userIds: id5Id --- diff --git a/dev-docs/bidders/ias.md b/dev-docs/bidders/ias.md index c9e88f4860..cdbe4c3fa3 100644 --- a/dev-docs/bidders/ias.md +++ b/dev-docs/bidders/ias.md @@ -4,7 +4,6 @@ title: Integral Ad Science (IAS) description: Prebid Integral Ad Science Bidder Adaptor pbjs: true biddercode: ias -pbjs_version_notes: for 5.x, use the module --- ### Note: diff --git a/dev-docs/bidders/iprom.md b/dev-docs/bidders/iprom.md index f9d05f25cc..3dddd983c9 100644 --- a/dev-docs/bidders/iprom.md +++ b/dev-docs/bidders/iprom.md @@ -6,7 +6,6 @@ biddercode: iprom media_types: banner pbjs: true enable_download: true -pbjs_version_notes: not in 5.x, in 6.2+ --- ### Prebid Server Note: diff --git a/dev-docs/bidders/luponmedia.md b/dev-docs/bidders/luponmedia.md index 598bc5d82e..3d13033110 100644 --- a/dev-docs/bidders/luponmedia.md +++ b/dev-docs/bidders/luponmedia.md @@ -9,7 +9,6 @@ usp_supported: true coppa_supported: true schain_supported: true userIds: digitrust, identityLink, liveIntentId, pubCommonId -pbjs_version_notes: not in 5.x, in 6.2+ --- ### Note: diff --git a/dev-docs/bidders/missena.md b/dev-docs/bidders/missena.md index 895cfe8c43..fdff453fb1 100644 --- a/dev-docs/bidders/missena.md +++ b/dev-docs/bidders/missena.md @@ -6,7 +6,6 @@ biddercode: missena gvl_id: 867 pbjs: true safeframes_ok: false -pbjs_version_notes: not in 5.x, in 6.2+ --- ### Note diff --git a/dev-docs/bidders/open8.md b/dev-docs/bidders/open8.md index fd97dc9a0e..fdb027d1fd 100644 --- a/dev-docs/bidders/open8.md +++ b/dev-docs/bidders/open8.md @@ -6,7 +6,6 @@ pbjs: true biddercode: open8 media_types: video, banner enable_download: true -pbjs_version_notes: added version 6.16 --- ### Bid Params diff --git a/dev-docs/bidders/optimera.md b/dev-docs/bidders/optimera.md index 2aaf77483a..a71b751b1f 100644 --- a/dev-docs/bidders/optimera.md +++ b/dev-docs/bidders/optimera.md @@ -4,7 +4,6 @@ title: Optimera description: Optimera Bidder Adaptor pbjs: true biddercode: optimera -pbjs_version_notes: for 5.x, use the module --- ### Bid Params diff --git a/dev-docs/bidders/outbrain.md b/dev-docs/bidders/outbrain.md index 1993541c29..c90c645d66 100644 --- a/dev-docs/bidders/outbrain.md +++ b/dev-docs/bidders/outbrain.md @@ -14,7 +14,6 @@ pbs: true pbs_app_supported: true prebid_member: true userIds: id5Id, identityLink -pbjs_version_notes: v4.35 and later floors_supported: true multiformat_supported: will-bid-on-one ortb_blocking_supported: partial diff --git a/dev-docs/bidders/smartx.md b/dev-docs/bidders/smartx.md index e65dabd5e1..c9414be19a 100644 --- a/dev-docs/bidders/smartx.md +++ b/dev-docs/bidders/smartx.md @@ -11,7 +11,6 @@ schain_supported: false usp_supported: true safeframes_ok: false pbjs: true -pbjs_version_notes: avoid 4.31-4.39 floors_supported: true --- diff --git a/dev-docs/bidders/talkads.md b/dev-docs/bidders/talkads.md index eed57d1a16..b4c6289cc6 100644 --- a/dev-docs/bidders/talkads.md +++ b/dev-docs/bidders/talkads.md @@ -12,7 +12,6 @@ safeframes_ok: false pbjs: true pbs: false prebid_member: false -pbjs_version_notes: v4.35 and later --- ### Registration diff --git a/dev-docs/bidders/turktelekom.md b/dev-docs/bidders/turktelekom.md index d845c7e845..5a5bdc0be1 100644 --- a/dev-docs/bidders/turktelekom.md +++ b/dev-docs/bidders/turktelekom.md @@ -12,7 +12,6 @@ usp_supported: true coppa_supported: true pbs_app_supported: true schain_supported: true -pbjs_version_notes: v5.18+ safeframes_ok: true --- diff --git a/dev-docs/bidders/vibrantmedia.md b/dev-docs/bidders/vibrantmedia.md index 437583bcdb..c8bdabd047 100644 --- a/dev-docs/bidders/vibrantmedia.md +++ b/dev-docs/bidders/vibrantmedia.md @@ -9,7 +9,6 @@ usp_supported: true media_types: banner, video, native safeframes_ok: false pbjs: true -pbjs_version_notes: 6.4.0 and later --- ### Preliminaries From a1e47fd7a78aacaaae971bb19d4f4f939b0e68c9 Mon Sep 17 00:00:00 2001 From: Chris Huie Date: Tue, 27 Sep 2022 10:02:57 -0600 Subject: [PATCH 017/280] Remove Adapters no longer in maintained versions from download page (#4043) * update outdated note and remove from download * remove lkqd and outbrain old download --- dev-docs/bidders/groupm.md | 2 +- dev-docs/bidders/lkqd.md | 2 +- dev-docs/bidders/outbrain_old.md | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) diff --git a/dev-docs/bidders/groupm.md b/dev-docs/bidders/groupm.md index 166b07d703..91c6f2e173 100644 --- a/dev-docs/bidders/groupm.md +++ b/dev-docs/bidders/groupm.md @@ -18,7 +18,7 @@ pbs: true pbs_app_supported: true fpd_supported: true gvl_id: 98 -pbjs_version_notes: not supported in 6.24+ +enable_download : false --- {: .alert.alert-warning :} diff --git a/dev-docs/bidders/lkqd.md b/dev-docs/bidders/lkqd.md index ecc917df44..9017a73a1b 100644 --- a/dev-docs/bidders/lkqd.md +++ b/dev-docs/bidders/lkqd.md @@ -7,7 +7,7 @@ biddercode: lkqd media_types: video gdpr_supported: true schain_supported: true -pbjs_version_notes: not ported to 5.x +enable_download : false --- ### Note: diff --git a/dev-docs/bidders/outbrain_old.md b/dev-docs/bidders/outbrain_old.md index 4230546a4e..155f60b360 100644 --- a/dev-docs/bidders/outbrain_old.md +++ b/dev-docs/bidders/outbrain_old.md @@ -14,7 +14,7 @@ pbjs: true pbs: true pbs_app_supported: true prebid_member: true -pbjs_version_notes: for versions 4.20-4.34 +enable_download : false ortb_blocking_supported: partial --- From c74b9a5f1f35a057a0eeeb36ad15e6c9b020e4c4 Mon Sep 17 00:00:00 2001 From: bretg Date: Tue, 27 Sep 2022 13:08:30 -0400 Subject: [PATCH 018/280] Update aliasBidder.md (#4046) --- dev-docs/publisher-api-reference/aliasBidder.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/dev-docs/publisher-api-reference/aliasBidder.md b/dev-docs/publisher-api-reference/aliasBidder.md index 2e8e35c8a9..206b16a90a 100644 --- a/dev-docs/publisher-api-reference/aliasBidder.md +++ b/dev-docs/publisher-api-reference/aliasBidder.md @@ -9,7 +9,7 @@ To define an alias for a bidder adapter, call this method at runtime: {% highlight js %} -pbjs.aliasBidder('appnexus', 'newAlias', options: { gvlid: 111111} ); +pbjs.aliasBidder('appnexus', 'newAlias', optionsObject ); {% endhighlight %} From c515a196a5dd07da29772eb2551e54ce23eb42b8 Mon Sep 17 00:00:00 2001 From: bretg Date: Tue, 27 Sep 2022 16:40:34 -0400 Subject: [PATCH 019/280] sharedid: version note (#4047) --- identity/sharedid.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/identity/sharedid.md b/identity/sharedid.md index be8913d04a..77ab971f97 100644 --- a/identity/sharedid.md +++ b/identity/sharedid.md @@ -33,7 +33,7 @@ There are multiple ways to integrate SharedId on your site. See the table below The SharedID ID system sets a user id cookie in the publisher’s domain. Since the cookie is set in the publisher's first party domain it does not fall in scope of browser restrictions on third party cookies. Safari has restrictions on first party cookies set via document.cookie. For this reason we recommend considering a server endpoint installation for maximum effect. See the "Alternate Implementations" section below. -### Prebid.js 5.x +### Prebid.js 5 and later The SharedId module reads and/or sets a random ID in the cookie name defined by the publisher when initializing From 9dacb5070fae0dda5ae431d17ab1ab0ba95e239b Mon Sep 17 00:00:00 2001 From: bretg Date: Thu, 29 Sep 2022 13:56:30 -0400 Subject: [PATCH 020/280] interstitial typo (#4051) --- prebid-mobile/pbm-api/android/code-integration-android.md | 2 +- prebid-mobile/pbm-api/android/pbm-adunit-android.md | 6 +++--- prebid-mobile/pbm-api/android/pbm-api-android.md | 2 +- .../pbm-api/android/pbm-api-result-codes-android.md | 2 +- prebid-mobile/pbm-api/android/pbm-banneradunit-android.md | 2 +- prebid-mobile/pbm-api/android/pbm-nativeadunit-android.md | 2 +- .../pbm-api/android/pbm-videooutstreamadunit-android.md | 2 +- .../pbm-api/android/prebidmobile-object-android.md | 2 +- prebid-mobile/pbm-api/ios/code-integration-ios.md | 2 +- prebid-mobile/pbm-api/ios/pbm-adunit-ios.md | 2 +- prebid-mobile/pbm-api/ios/pbm-api-result-codes-ios.md | 2 +- prebid-mobile/pbm-api/ios/pbm-banneradunit-ios.md | 2 +- prebid-mobile/pbm-api/ios/pbm-nativeadunit-ios.md | 2 +- prebid-mobile/pbm-api/ios/pbm-videooutstreamadunit-ios.md | 2 +- prebid-mobile/pbm-api/ios/prebidmobile-object-ios.md | 2 +- prebid-server/endpoints/openrtb2/pbs-endpoint-auction.md | 2 +- prebid-server/features/pbs-interstitials.md | 2 +- 17 files changed, 19 insertions(+), 19 deletions(-) diff --git a/prebid-mobile/pbm-api/android/code-integration-android.md b/prebid-mobile/pbm-api/android/code-integration-android.md index b61db1d2d6..50ea7bb9a0 100644 --- a/prebid-mobile/pbm-api/android/code-integration-android.md +++ b/prebid-mobile/pbm-api/android/code-integration-android.md @@ -131,7 +131,7 @@ Prebid supports the following versions by release: - [Prebid Mobile API - Android]({{site.baseurl}}/prebid-mobile/pbm-api/android/pbm-api-android.html) - [Ad Unit](/prebid-mobile/pbm-api/android/pbm-adunit-android.html) - [Banner Ad Unit](/prebid-mobile/pbm-api/android/pbm-banneradunit-android.html) -- [Intersitial Ad Unit](/prebid-mobile/pbm-api/android/pbm-bannerinterstitialadunit-android.html) +- [Interstitial Ad Unit](/prebid-mobile/pbm-api/android/pbm-bannerinterstitialadunit-android.html) - [Result Codes]({{site.baseurl}}/prebid-mobile/pbm-api/android/pbm-api-result-codes-android.html) - [Targeting Parameters]({{site.baseurl}}/prebid-mobile/pbm-api/android/pbm-targeting-params-android.html) - [Prebid Mobile API - Android]({{site.baseurl}}/prebid-mobile/pbm-api/android/pbm-api-android.html) diff --git a/prebid-mobile/pbm-api/android/pbm-adunit-android.md b/prebid-mobile/pbm-api/android/pbm-adunit-android.md index 216ec73a8b..e75ab91015 100755 --- a/prebid-mobile/pbm-api/android/pbm-adunit-android.md +++ b/prebid-mobile/pbm-api/android/pbm-adunit-android.md @@ -24,12 +24,12 @@ The `AdUnit` object is an abstract object that cannot be instantiated. Use the [ **Parameters** - `configId`: String containing the Prebid Server configuration ID. Note: this is a Prebid Server [impression-level stored request ID](/prebid-server/features/pbs-storedreqs.html). -- `adType`: `BANNER` or `INTERSITIAL`. This value will be set by the object based on which type of ad unit object you create. +- `adType`: `BANNER` or `INTERSTITIAL`. This value will be set by the object based on which type of ad unit object you create. **Properties** - `configId`: Prebid Server configuration ID. Note: this is a Prebid Server [impression-level stored request ID](/prebid-server/features/pbs-storedreqs.html). -- `adType`: `BANNER` or `INTERSITIAL`. +- `adType`: `BANNER` or `INTERSTITIAL`. - `periodMillis`: Integer defining the refresh time in milliseconds. Default = 0, meaning no auto refresh. - `keywords`: ArrayList containing keys and values. @@ -326,7 +326,7 @@ adUnit.fetchDemand(builder, new OnCompleteListener() { - [Prebid Mobile API - Android]({{site.baseurl}}/prebid-mobile/pbm-api/android/pbm-api-android.html) - [Banner Ad Unit](/prebid-mobile/pbm-api/android/pbm-banneradunit-android.html) -- [Intersitial Ad Unit](/prebid-mobile/pbm-api/android/pbm-bannerinterstitialadunit-android.html) +- [Interstitial Ad Unit](/prebid-mobile/pbm-api/android/pbm-bannerinterstitialadunit-android.html) - [Result Codes]({{site.baseurl}}/prebid-mobile/pbm-api/android/pbm-api-result-codes-android.html) - [Targeting Parameters]({{site.baseurl}}/prebid-mobile/pbm-api/android/pbm-targeting-params-android.html) - [Prebid Mobile Object]({{site.baseurl}}/prebid-mobile/pbm-api/android/prebidmobile-object-android.html) diff --git a/prebid-mobile/pbm-api/android/pbm-api-android.md b/prebid-mobile/pbm-api/android/pbm-api-android.md index 7f5b006b82..a986f04359 100755 --- a/prebid-mobile/pbm-api/android/pbm-api-android.md +++ b/prebid-mobile/pbm-api/android/pbm-api-android.md @@ -23,7 +23,7 @@ The Prebid Mobile API supports instantiation of the following objects: - [Global Settings]({{site.baseurl}}/prebid-mobile/pbm-api/android/prebidmobile-object-android.html) - [Banner Ad Unit](/prebid-mobile/pbm-api/android/pbm-banneradunit-android.html) -- [Intersitial Ad Unit](/prebid-mobile/pbm-api/android/pbm-bannerinterstitialadunit-android.html) +- [Interstitial Ad Unit](/prebid-mobile/pbm-api/android/pbm-bannerinterstitialadunit-android.html) ## Result Codes diff --git a/prebid-mobile/pbm-api/android/pbm-api-result-codes-android.md b/prebid-mobile/pbm-api/android/pbm-api-result-codes-android.md index cdee4e55f3..4e74467083 100755 --- a/prebid-mobile/pbm-api/android/pbm-api-result-codes-android.md +++ b/prebid-mobile/pbm-api/android/pbm-api-result-codes-android.md @@ -68,7 +68,7 @@ When you use the Prebid Mobile API to retrieve bids, you'll receive a `ResultCod - [Prebid Mobile API - Android]({{site.baseurl}}/prebid-mobile/pbm-api/android/pbm-api-android.html) - [Ad Unit](/prebid-mobile/pbm-api/android/pbm-adunit-android.html) - [Banner Ad Unit](/prebid-mobile/pbm-api/android/pbm-banneradunit-android.html) -- [Intersitial Ad Unit](/prebid-mobile/pbm-api/android/pbm-bannerinterstitialadunit-android.html) +- [Interstitial Ad Unit](/prebid-mobile/pbm-api/android/pbm-bannerinterstitialadunit-android.html) - [Result Codes]({{site.baseurl}}/prebid-mobile/pbm-api/android/pbm-api-result-codes-android.html) - [Targeting Parameters]({{site.baseurl}}/prebid-mobile/pbm-api/android/pbm-targeting-params-android.html) - [Prebid Mobile Object]({{site.baseurl}}/prebid-mobile/pbm-api/android/prebidmobile-object-android.html) diff --git a/prebid-mobile/pbm-api/android/pbm-banneradunit-android.md b/prebid-mobile/pbm-api/android/pbm-banneradunit-android.md index 6c2199e327..f9c4513a56 100755 --- a/prebid-mobile/pbm-api/android/pbm-banneradunit-android.md +++ b/prebid-mobile/pbm-api/android/pbm-banneradunit-android.md @@ -96,7 +96,7 @@ bannerAdUnit.fetchDemand(request, new onCompleteListener() { - [Prebid Mobile API - Android]({{site.baseurl}}/prebid-mobile/pbm-api/android/pbm-api-android.html) - [Ad Unit](/prebid-mobile/pbm-api/android/pbm-adunit-android.html) -- [Intersitial Ad Unit](/prebid-mobile/pbm-api/android/pbm-bannerinterstitialadunit-android.html) +- [Interstitial Ad Unit](/prebid-mobile/pbm-api/android/pbm-bannerinterstitialadunit-android.html) - [Result Codes]({{site.baseurl}}/prebid-mobile/pbm-api/android/pbm-api-result-codes-android.html) - [Targeting Parameters]({{site.baseurl}}/prebid-mobile/pbm-api/android/pbm-targeting-params-android.html) - [Prebid Mobile Object]({{site.baseurl}}/prebid-mobile/pbm-api/android/prebidmobile-object-android.html) diff --git a/prebid-mobile/pbm-api/android/pbm-nativeadunit-android.md b/prebid-mobile/pbm-api/android/pbm-nativeadunit-android.md index 71c9f9939f..277db8faff 100644 --- a/prebid-mobile/pbm-api/android/pbm-nativeadunit-android.md +++ b/prebid-mobile/pbm-api/android/pbm-nativeadunit-android.md @@ -109,7 +109,7 @@ nativeAdUnit.fetchDemand(adView, new OnCompleteListener() { - [Prebid Mobile API - Android]({{site.baseurl}}/prebid-mobile/pbm-api/android/pbm-api-android.html) - [Ad Unit](/prebid-mobile/pbm-api/android/pbm-adunit-android.html) - [Banner Ad Unit]({{site.baseurl}}/prebid-mobile/pbm-api/android/pbm-banneradunit-android.html) -- [Intersitial Ad Unit](/prebid-mobile/pbm-api/android/pbm-bannerinterstitialadunit-android.html) +- [Interstitial Ad Unit](/prebid-mobile/pbm-api/android/pbm-bannerinterstitialadunit-android.html) - [Result Codes]({{site.baseurl}}/prebid-mobile/pbm-api/android/pbm-api-result-codes-android.html) - [Targeting Parameters]({{site.baseurl}}/prebid-mobile/pbm-api/android/pbm-targeting-params-android.html) - [Prebid Mobile Object]({{site.baseurl}}/prebid-mobile/pbm-api/android/prebidmobile-object-android.html) diff --git a/prebid-mobile/pbm-api/android/pbm-videooutstreamadunit-android.md b/prebid-mobile/pbm-api/android/pbm-videooutstreamadunit-android.md index 634e8feb22..eecc48a8c8 100755 --- a/prebid-mobile/pbm-api/android/pbm-videooutstreamadunit-android.md +++ b/prebid-mobile/pbm-api/android/pbm-videooutstreamadunit-android.md @@ -194,7 +194,7 @@ private void loadBanner() { - [Prebid Mobile API - Android]({{site.baseurl}}/prebid-mobile/pbm-api/android/pbm-api-android.html) - [Ad Unit]({{site.baseurl}}/prebid-mobile/pbm-api/android/pbm-adunit-android.html) -- [Intersitial Ad Unit]({{site.baseurl}}/prebid-mobile/pbm-api/android/pbm-bannerinterstitialadunit-android.html) +- [Interstitial Ad Unit]({{site.baseurl}}/prebid-mobile/pbm-api/android/pbm-bannerinterstitialadunit-android.html) - [Result Codes]({{site.baseurl}}/prebid-mobile/pbm-api/android/pbm-api-result-codes-android.html) - [Targeting Parameters]({{site.baseurl}}/prebid-mobile/pbm-api/android/pbm-targeting-params-android.html) - [Prebid Mobile Object]({{site.baseurl}}/prebid-mobile/pbm-api/android/prebidmobile-object-android.html) diff --git a/prebid-mobile/pbm-api/android/prebidmobile-object-android.md b/prebid-mobile/pbm-api/android/prebidmobile-object-android.md index 751850a1a7..62c6884958 100755 --- a/prebid-mobile/pbm-api/android/prebidmobile-object-android.md +++ b/prebid-mobile/pbm-api/android/prebidmobile-object-android.md @@ -240,7 +240,7 @@ PrebidMobile.setPbsDebug(true); - [Prebid Mobile API - Android]({{site.baseurl}}/prebid-mobile/pbm-api/android/pbm-api-android.html) - [Ad Unit](/prebid-mobile/pbm-api/android/pbm-adunit-android.html) - [Banner Ad Unit](/prebid-mobile/pbm-api/android/pbm-banneradunit-android.html) -- [Intersitial Ad Unit](/prebid-mobile/pbm-api/android/pbm-bannerinterstitialadunit-android.html) +- [Interstitial Ad Unit](/prebid-mobile/pbm-api/android/pbm-bannerinterstitialadunit-android.html) - [Result Codes]({{site.baseurl}}/prebid-mobile/pbm-api/android/pbm-api-result-codes-android.html) - [Targeting Parameters]({{site.baseurl}}/prebid-mobile/pbm-api/android/pbm-targeting-params-android.html) - [Prebid Mobile API - iOS]({{site.baseurl}}/prebid-mobile/pbm-api/ios/pbm-api-ios.html) diff --git a/prebid-mobile/pbm-api/ios/code-integration-ios.md b/prebid-mobile/pbm-api/ios/code-integration-ios.md index dca08a5f04..1452d32a5c 100644 --- a/prebid-mobile/pbm-api/ios/code-integration-ios.md +++ b/prebid-mobile/pbm-api/ios/code-integration-ios.md @@ -224,7 +224,7 @@ func adViewDidReceiveAd(_ bannerView: GADBannerView) { - [Prebid Mobile API - iOS]({{site.baseurl}}/prebid-mobile/pbm-api/ios/pbm-api-ios.html) - [Ad Unit]({{site.baseurl}}/prebid-mobile/pbm-api/ios/pbm-adunit-ios.html) - [Banner Ad Unit](/prebid-mobile/pbm-api/ios/pbm-banneradunit-ios.html) -- [Intersitial Ad Unit]({{site.baseurl}}/prebid-mobile/pbm-api/ios/pbm-bannerinterstitialadunit-ios.html) +- [Interstitial Ad Unit]({{site.baseurl}}/prebid-mobile/pbm-api/ios/pbm-bannerinterstitialadunit-ios.html) - [Result Codes]({{site.baseurl}}/prebid-mobile/pbm-api/ios/pbm-api-result-codes-ios.html) - [Targeting Parameters]({{site.baseurl}}/prebid-mobile/pbm-api/ios/pbm-targeting-ios.html) - [Prebid Mobile Object]({{site.baseurl}}/prebid-mobile/pbm-api/ios/prebidmobile-object-ios.html) diff --git a/prebid-mobile/pbm-api/ios/pbm-adunit-ios.md b/prebid-mobile/pbm-api/ios/pbm-adunit-ios.md index 92513cc1a1..4ba7351da8 100755 --- a/prebid-mobile/pbm-api/ios/pbm-adunit-ios.md +++ b/prebid-mobile/pbm-api/ios/pbm-adunit-ios.md @@ -395,7 +395,7 @@ bannerAdUnit.addContextData(key: "adunitContextDataKey1", value: "adunitContextD - [Prebid Mobile API - iOS]({{site.baseurl}}/prebid-mobile/pbm-api/ios/pbm-api-ios.html) - [Banner Ad Unit](/prebid-mobile/pbm-api/ios/pbm-banneradunit-ios.html) -- [Intersitial Ad Unit]({{site.baseurl}}/prebid-mobile/pbm-api/ios/pbm-bannerinterstitialadunit-ios.html) +- [Interstitial Ad Unit]({{site.baseurl}}/prebid-mobile/pbm-api/ios/pbm-bannerinterstitialadunit-ios.html) - [Result Codes]({{site.baseurl}}/prebid-mobile/pbm-api/ios/pbm-api-result-codes-ios.html) - [Targeting Parameters]({{site.baseurl}}/prebid-mobile/pbm-api/ios/pbm-targeting-ios.html) - [Prebid Mobile Object]({{site.baseurl}}/prebid-mobile/pbm-api/ios/prebidmobile-object-ios.html) diff --git a/prebid-mobile/pbm-api/ios/pbm-api-result-codes-ios.md b/prebid-mobile/pbm-api/ios/pbm-api-result-codes-ios.md index 04f0c91559..5d02cecdf8 100755 --- a/prebid-mobile/pbm-api/ios/pbm-api-result-codes-ios.md +++ b/prebid-mobile/pbm-api/ios/pbm-api-result-codes-ios.md @@ -67,7 +67,7 @@ When you use the Prebid Mobile API to retrieve bids, you'll receive a ResultCode - [Prebid Mobile API - iOS]({{site.baseurl}}/prebid-mobile/pbm-api/ios/pbm-api-ios.html) - [Ad Unit]({{site.baseurl}}/prebid-mobile/pbm-api/ios/pbm-adunit-ios.html) - [Banner Ad Unit](/prebid-mobile/pbm-api/ios/pbm-banneradunit-ios.html) -- [Intersitial Ad Unit](/prebid-mobile/pbm-api/ios/pbm-bannerinterstitialadunit-ios.html) +- [Interstitial Ad Unit](/prebid-mobile/pbm-api/ios/pbm-bannerinterstitialadunit-ios.html) - [Targeting Parameters]({{site.baseurl}}/prebid-mobile/pbm-api/ios/pbm-targeting-ios.html) - [Prebid Mobile Object]({{site.baseurl}}/prebid-mobile/pbm-api/ios/prebidmobile-object-ios.html) - [Prebid Mobile API - Android]({{site.baseurl}}/prebid-mobile/pbm-api/android/pbm-api-android.html) diff --git a/prebid-mobile/pbm-api/ios/pbm-banneradunit-ios.md b/prebid-mobile/pbm-api/ios/pbm-banneradunit-ios.md index e537596409..5cc020fe8f 100755 --- a/prebid-mobile/pbm-api/ios/pbm-banneradunit-ios.md +++ b/prebid-mobile/pbm-api/ios/pbm-banneradunit-ios.md @@ -197,7 +197,7 @@ func loadMoPubBanner(bannerUnit: AdUnit){ - [Prebid Mobile API - iOS]({{site.baseurl}}/prebid-mobile/pbm-api/ios/pbm-api-ios.html) - [Ad Unit]({{site.baseurl}}/prebid-mobile/pbm-api/ios/pbm-adunit-ios.html) -- [Intersitial Ad Unit]({{site.baseurl}}/prebid-mobile/pbm-api/ios/pbm-bannerinterstitialadunit-ios.html) +- [Interstitial Ad Unit]({{site.baseurl}}/prebid-mobile/pbm-api/ios/pbm-bannerinterstitialadunit-ios.html) - [Result Codes]({{site.baseurl}}/prebid-mobile/pbm-api/ios/pbm-api-result-codes-ios.html) - [Targeting Parameters]({{site.baseurl}}/prebid-mobile/pbm-api/ios/pbm-targeting-ios.html) - [Prebid Mobile Object]({{site.baseurl}}/prebid-mobile/pbm-api/ios/prebidmobile-object-ios.html) diff --git a/prebid-mobile/pbm-api/ios/pbm-nativeadunit-ios.md b/prebid-mobile/pbm-api/ios/pbm-nativeadunit-ios.md index 3d69e27686..f29ce75f4f 100644 --- a/prebid-mobile/pbm-api/ios/pbm-nativeadunit-ios.md +++ b/prebid-mobile/pbm-api/ios/pbm-nativeadunit-ios.md @@ -111,7 +111,7 @@ nativeUnit.fetchDemand(adObject: self.request) { [weak self] (resultCode: Result - [Prebid Mobile API - iOS]({{site.baseurl}}/prebid-mobile/pbm-api/ios/pbm-api-ios.html) - [Ad Unit]({{site.baseurl}}/prebid-mobile/pbm-api/ios/pbm-adunit-ios.html) - [Banner Ad Unit]({{site.baseurl}}/prebid-mobile/pbm-api/ios/pbm-banneradunit-ios.html) -- [Intersitial Ad Unit]({{site.baseurl}}/prebid-mobile/pbm-api/ios/pbm-bannerinterstitialadunit-ios.html) +- [Interstitial Ad Unit]({{site.baseurl}}/prebid-mobile/pbm-api/ios/pbm-bannerinterstitialadunit-ios.html) - [Result Codes]({{site.baseurl}}/prebid-mobile/pbm-api/ios/pbm-api-result-codes-ios.html) - [Targeting Parameters]({{site.baseurl}}/prebid-mobile/pbm-api/ios/pbm-targeting-ios.html) - [Prebid Mobile Object]({{site.baseurl}}/prebid-mobile/pbm-api/ios/prebidmobile-object-ios.html) diff --git a/prebid-mobile/pbm-api/ios/pbm-videooutstreamadunit-ios.md b/prebid-mobile/pbm-api/ios/pbm-videooutstreamadunit-ios.md index bd673ce00b..d4a0060015 100755 --- a/prebid-mobile/pbm-api/ios/pbm-videooutstreamadunit-ios.md +++ b/prebid-mobile/pbm-api/ios/pbm-videooutstreamadunit-ios.md @@ -234,7 +234,7 @@ Import the GoogleMobileAds from [google-mobile-sdk](https://developers.google.co - [Prebid Mobile API - iOS]({{site.baseurl}}/prebid-mobile/pbm-api/ios/pbm-api-ios.html) - [Ad Unit]({{site.baseurl}}/prebid-mobile/pbm-api/ios/pbm-adunit-ios.html) -- [Intersitial Ad Unit]({{site.baseurl}}/prebid-mobile/pbm-api/ios/pbm-bannerinterstitialadunit-ios.html) +- [Interstitial Ad Unit]({{site.baseurl}}/prebid-mobile/pbm-api/ios/pbm-bannerinterstitialadunit-ios.html) - [Result Codes]({{site.baseurl}}/prebid-mobile/pbm-api/ios/pbm-api-result-codes-ios.html) - [Targeting Parameters]({{site.baseurl}}/prebid-mobile/pbm-api/ios/pbm-targeting-ios.html) - [Prebid Mobile Object]({{site.baseurl}}/prebid-mobile/pbm-api/ios/prebidmobile-object-ios.html) diff --git a/prebid-mobile/pbm-api/ios/prebidmobile-object-ios.md b/prebid-mobile/pbm-api/ios/prebidmobile-object-ios.md index 58d76b786d..7deff0c0ca 100644 --- a/prebid-mobile/pbm-api/ios/prebidmobile-object-ios.md +++ b/prebid-mobile/pbm-api/ios/prebidmobile-object-ios.md @@ -182,7 +182,7 @@ Prebid.shared.pbsDebug = true; - [Prebid Mobile API - iOS]({{site.baseurl}}/prebid-mobile/pbm-api/ios/pbm-api-ios.html) - [Banner Ad Unit](/prebid-mobile/pbm-api/ios/pbm-banneradunit-ios.html) -- [Intersitial Ad Unit]({{site.baseurl}}/prebid-mobile/pbm-api/ios/pbm-bannerinterstitialadunit-ios.html) +- [Interstitial Ad Unit]({{site.baseurl}}/prebid-mobile/pbm-api/ios/pbm-bannerinterstitialadunit-ios.html) - [Result Codes]({{site.baseurl}}/prebid-mobile/pbm-api/ios/pbm-api-result-codes-ios.html) - [Targeting Parameters]({{site.baseurl}}/prebid-mobile/pbm-api/ios/pbm-targeting-ios.html) - [Prebid Mobile Object]({{site.baseurl}}/prebid-mobile/pbm-api/ios/prebidmobile-object-ios.html) diff --git a/prebid-server/endpoints/openrtb2/pbs-endpoint-auction.md b/prebid-server/endpoints/openrtb2/pbs-endpoint-auction.md index bd4872a181..86345d07ed 100644 --- a/prebid-server/endpoints/openrtb2/pbs-endpoint-auction.md +++ b/prebid-server/endpoints/openrtb2/pbs-endpoint-auction.md @@ -619,7 +619,7 @@ These fields will be forwarded to each Bidder, so they can decide how to process ##### Interstitial support Additional support for interstitials is enabled through the addition of two fields to the request: -device.ext.prebid.interstitial.minwidthperc and device.ext.interstial.minheightperc +device.ext.prebid.interstitial.minwidthperc and device.ext.interstitial.minheightperc The values will be numbers that indicate the minimum allowed size for the ad, as a percentage of the base side. For example, a width of 600 and "minwidthperc": 60 would allow ads with widths from 360 to 600 pixels inclusive. Example: diff --git a/prebid-server/features/pbs-interstitials.md b/prebid-server/features/pbs-interstitials.md index 1bd83d12fd..4ea307ba8c 100644 --- a/prebid-server/features/pbs-interstitials.md +++ b/prebid-server/features/pbs-interstitials.md @@ -8,7 +8,7 @@ title: Prebid Server | Features | Interstitials # Prebid Server | Features | Interstitials Support for interstitial ads is enabled with the addition of two fields to the OpenRTB request: `device.ext.prebid.interstitial.minwidthperc` -and `device.ext.interstial.minheightperc` The values will be numbers that indicate the minimum allowed +and `device.ext.interstitial.minheightperc` The values will be numbers that indicate the minimum allowed size for the ad, as a percentage of the base side. For example, a width of 600 and "minwidthperc": 60 would allow ads with widths from 360 to 600 pixels inclusive. From 074b5d8c1617226278e4578579b949b9767be000 Mon Sep 17 00:00:00 2001 From: Maxim Schuwalow <16665913+mschuwalow@users.noreply.github.com> Date: Thu, 29 Sep 2022 22:59:52 +0200 Subject: [PATCH 021/280] LiveIntent UserId Module: Allow resolving uid2 (#4048) * [CM-587] Update liveintent userid module documentation * update docs * Update dev-docs/modules/userId.md Co-authored-by: Wiem Zine El Abidine * add note about caching * Update dev-docs/modules/userId.md Co-authored-by: Viktor Dreiling <34981284+3link@users.noreply.github.com> Co-authored-by: Wiem Zine El Abidine Co-authored-by: Viktor Dreiling <34981284+3link@users.noreply.github.com> --- dev-docs/modules/userId.md | 55 ++++++++++++++++++++++++++++---------- 1 file changed, 41 insertions(+), 14 deletions(-) diff --git a/dev-docs/modules/userId.md b/dev-docs/modules/userId.md index 9eecfe85cc..59807d7f58 100644 --- a/dev-docs/modules/userId.md +++ b/dev-docs/modules/userId.md @@ -29,7 +29,7 @@ The User ID module supports multiple ways of establishing pseudonymous IDs for u 1. If GDPR applies, the consent signal from the CMP is hashed and stored in a cookie called `_pbjs_userid_consent_data`. This is required so that ID sub-modules may be called to refresh their ID if the user's consent preferences have changed from the previous page, and ensures cached IDs are no longer used if consent is withdrawn. 1. An object containing one or more IDs (`bidRequest.userId`) is made available to Prebid.js adapters and Prebid Server S2S adapters. 1. In addition to `bidRequest.userId`, `bidRequest.userIdAsEids` is made available to Prebid.js adapters and Prebid Server S2S adapters. `bidRequest.userIdAsEids` has userIds in ORTB EIDS format. -1. The page can call [pbjs.getUserIds()](/dev-docs/publisher-api-reference/getUserIds.html), [pbjs.getUserIdsAsEids()](/dev-docs/publisher-api-reference/getUserIdsAsEids.html), or [pbjs.getUserIdsAsync()](/dev-docs/publisher-api-reference/getUserIdsAsync.html). +1. The page can call [pbjs.getUserIds()](/dev-docs/publisher-api-reference/getUserIds.html), [pbjs.getUserIdsAsEids()](/dev-docs/publisher-api-reference/getUserIdsAsEids.html), or [pbjs.getUserIdsAsync()](/dev-docs/publisher-api-reference/getUserIdsAsync.html). {: .alert.alert-info :} Note: If your ID structure is complicated, it is helpful to add tests for pbjs.getUserIds(), pbjs.getUserIdsAsEids() and pbjs.getUserIdsAsync(). @@ -74,9 +74,9 @@ Publishers that want to do this should design their workflow and then set `_pbjs By including this module and one or more of the sub-modules, a number of new options become available in `setConfig()`, under the `userSync` object as attributes of the `userIds` array -of sub-objects. +of sub-objects. -Publishers using Google AdManager may want to sync one of the identifiers as their Google PPID for frequency capping or reporting. +Publishers using Google AdManager may want to sync one of the identifiers as their Google PPID for frequency capping or reporting. The PPID in GAM (which is unrelated to the PPID UserId Submodule) has strict rules; refer to [Google AdManager documentation](https://support.google.com/admanager/answer/2880055?hl=en) for them. Please note, Prebid uses a [GPT command](https://developers.google.com/publisher-tag/reference#googletag.PubAdsService) to sync identifiers for publisher convenience. It doesn't currently work for instream video requests, as Prebid typically interacts with the player, which in turn may interact with IMA. IMA does has a [similar method](https://developers.google.com/interactive-media-ads/docs/sdks/html5/client-side/reference/js/google.ima.ImaSdkSettings#setPpid) as GPT, but IMA does not gather this ID from GPT. {: .table .table-bordered .table-striped } @@ -1237,9 +1237,35 @@ The first-party cookie generation and identity resolution functionality is provi The LiveIntent ID sub-module follows the standard Prebid.js initialization based on the GDPR consumer opt-out choices. With regard to CCPA, the LiveConnect JS receives a us_privacy string from the Prebid US Privacy Consent Management Module and respects opt-outs. +#### Resolving uid2 + +Attributes other than the nonID can be requested using the requestedAttributesOverrides configuration option. + +One attribute that requires special mention here is 'uid2'. If this attribute is resolved by the id module +it will be exposed in the same format as from the Unified ID 2.0 userid module. If both the LiveIntent module +and the uid2 module manage to resolve an uid2, the one from the uid2 module will be used. +Enabling this option in addition to the uid2 module is an easy way to increase your uid2 resolution rates. +Example configuration to enable uid2 resolution: + +{% highlight javascript %} +pbjs.setConfig({ + userSync: { + userIds: [{ + "name": "liveIntentId", + "params": { + "publisherId": "12432415", + "requestedAttributesOverrides": {'uid2': true}, + }, + }] + } +}); +{% endhighlight %} #### LiveIntent ID configuration +{: .alert.alert-info :} +NOTE: For optimal performance, the LiveIntent ID module should be called at every opportunity. It is best not to use `params.storage` with this module as the module has its own optimal caching mechanism. + {: .table .table-bordered .table-striped } | Param under userSync.userIds[] | Scope | Type | Description | Example | | --- | --- | --- | --- | --- | @@ -1249,6 +1275,7 @@ The LiveIntent ID sub-module follows the standard Prebid.js initialization based | params.ajaxTimeout |Optional| Number |This configuration parameter defines the maximum duration of a call to the IdentityResolution endpoint. By default, 1000 milliseconds.|`1000`| | params.partner | Optional| String |The name of the partner whose data will be returned in the response.|`'prebid'`| | params.identifiersToResolve |Optional| Array[String] |Used to send additional identifiers in the request for LiveIntent to resolve against the LiveIntent ID.|`['my-id']`| +| params.requestedAttributesOverrides | Optional | Object | Object containing booleans used to override the default resolution. Attributes set to true will be added to the resolve list, while attributes set to false will be removed | `{'uid2': true}` | | params.emailHash |Optional| String |The hashed email address of a user. We can accept the hashes, which use the following hashing algorithms: md5, sha1, sha2.|`1a79a4d60de6718e8e5b326e338ae533`| | params.url | Optional| String |Use this to change the default endpoint URL if you can call the LiveIntent Identity Exchange within your own domain.|`'https://idx.my-domain.com'`| | params.liCollectConfig |Optional| Object |Container of all collector params.|| @@ -1504,12 +1531,12 @@ pbjs.setConfig({ name: 'novatiq', params: { // change to the Partner Number you received from Novatiq - sourceid '1a3' + sourceid '1a3' } } }], // 50ms maximum auction delay, applies to all userId modules - auctionDelay: 50 + auctionDelay: 50 } }); {% endhighlight %} @@ -1535,7 +1562,7 @@ pbjs.setConfig({ ### Novatiq Hyper ID with Prebid SharedID support -You can make use of the Prebid.js SharedId module as follows. +You can make use of the Prebid.js SharedId module as follows. #### Novatiq Hyper ID Configuration @@ -1549,7 +1576,7 @@ Module activation and configuration: {% highlight javascript %} pbjs.setConfig({ userSync: { - userIds: [ + userIds: [ { name: 'novatiq', params: { @@ -1559,14 +1586,14 @@ pbjs.setConfig({ // Use the sharedID module useSharedId: true, - // optional: will default to _pubcid if left blank. + // optional: will default to _pubcid if left blank. // If not left blank must match "name" in the the module above - sharedIdName: 'demo_pubcid' + sharedIdName: 'demo_pubcid' } } }], // 50ms maximum auction delay, applies to all userId modules - auctionDelay: 50 + auctionDelay: 50 } }); {% endhighlight %} @@ -1717,7 +1744,7 @@ The RampID privacy policy is at [https://liveramp.com/privacy/service-privacy-po | params | Required | Object | Container of all module params. | | | params.pid | Required | String | This is the Placement ID, a unique identifier that is used to identify each publisher, obtained from registering with LiveRamp. | `999` | | params.notUse3P | Not required | Boolean | Property for choosing if a cookieable envelope should be set and stored until the user authenticates and a RampID envelope can be created (either `true` or `false`). | `false` | -| storage | Required | Object | This object defines where and for how long the results of the call to get a RampID envelope will be stored. | +| storage | Required | Object | This object defines where and for how long the results of the call to get a RampID envelope will be stored. | | storage.type | Required | String | This parameter defines where the resolved RampID envelope will be stored (either `"cookie"` or `"html5"` localStorage). | `"cookie"` | | storage.name | Required | String | The name of the cookie or html5 localstorage where the resolved RampID envelope will be stored. LiveRamp requires `"idl_env"`. | `"idl_env"` | | storage.expires | Required | Integer | How long (in days) the RampID envelope information will be stored. To be GDPR and CCPA compliant, we strongly advise to set a 15-day TTL ("Time to Live" / expiration time). If you are not planning to obtain RampID envelopes for EU/EEA or U.S. users, we advise you to change the expiration time to 30 days. | `15` | @@ -1728,7 +1755,7 @@ The RampID privacy policy is at [https://liveramp.com/privacy/service-privacy-po #### RampID Examples -1) Publisher passes a Placement ID and elects to store the RampID envelope in a cookie. +1) Publisher passes a Placement ID and elects to store the RampID envelope in a cookie. {% highlight javascript %} pbjs.setConfig({ @@ -1918,7 +1945,7 @@ pbjs.setConfig({ #### Truspid onboarding -If you wish to find out more about Trustpid, please contact onboarding@trustpid.com +If you wish to find out more about Trustpid, please contact onboarding@trustpid.com ### PubProvided ID @@ -2435,7 +2462,7 @@ To access the complete set of IDs, you may use `getUserIdsAsync`, which returns pbjs.getUserIdsAsync().then(function (userIds) { // all IDs are available here: pbjs.getUserIds() // same as the `userIds` argument - pbjs.getUserIdsAsEids() + pbjs.getUserIdsAsEids() }); ``` From d620d3812c211077727bb2bfccf635f05690e4c8 Mon Sep 17 00:00:00 2001 From: bretg Date: Mon, 3 Oct 2022 10:45:12 -0400 Subject: [PATCH 022/280] Adapter doc instructions (#4053) * adding multiformat doc instructions * changed example doc heading --- dev-docs/bidder-adaptor.md | 1 + prebid-server/developers/add-new-bidder-go.md | 5 +++-- prebid-server/developers/add-new-bidder-java.md | 3 ++- 3 files changed, 6 insertions(+), 3 deletions(-) diff --git a/dev-docs/bidder-adaptor.md b/dev-docs/bidder-adaptor.md index 050b12c1c7..469b5d79d0 100644 --- a/dev-docs/bidder-adaptor.md +++ b/dev-docs/bidder-adaptor.md @@ -1190,6 +1190,7 @@ registerBidder(spec); - If you support floors, set `floors_supported: true`. No default value.. - If you support first party data, you must document what exactly is supported and then you may set `fpd_supported: true`. No default value. - If you support any OpenRTB blocking parameters, you must document what exactly is supported and then you may set `ortb_blocking_supported` to 'true','partial', or 'false'. No default value. In order to set 'true', you must support: bcat, badv, battr, and bapp. + - Let publishers know how you support multiformat requests -- those with more than one mediatype (e.g. both banner and video). Here are the options: will-bid-on-any, will-bid-on-one, will-not-bid - If you're a member of Prebid.org, add `prebid_member: true`. Default is false. - Submit both the code and docs pull requests diff --git a/prebid-server/developers/add-new-bidder-go.md b/prebid-server/developers/add-new-bidder-go.md index 2e0e243289..221ef4e80e 100644 --- a/prebid-server/developers/add-new-bidder-go.md +++ b/prebid-server/developers/add-new-bidder-go.md @@ -1184,14 +1184,14 @@ deals_supported: true/false floors_supported: true/false fpd_supported: true/false pbjs: true/false -pbs: true/false +pbs: true pbs_app_supported: true/false prebid_member: true/false multiformat_supported: will-bid-on-any, will-bid-on-one, will-not-bid ortb_blocking_supported: true/partial/false --- -### Note: +### Registration The Example Bidding adapter requires setup before beginning. Please contact us at setup@example.com @@ -1218,6 +1218,7 @@ Notes on the metadata fields: - If your bidder supports floors, set `floors_supported: true`. No default value. - If you support first party data, you must document what exactly is supported and then you may set `fpd_supported: true`. No default value. - If you support any OpenRTB blocking parameters, you must document what exactly is supported and then you may set `ortb_blocking_supported` to ‘true’,’partial’, or ‘false’. No default value. In order to set ‘true’, you must support: bcat, badv, battr, and bapp. +- Let publishers know how you support multiformat requests -- those with more than one mediatype (e.g. both banner and video). Here are the options: will-bid-on-any, will-bid-on-one, will-not-bid - If you're a member of Prebid.org, add `prebid_member: true`. Default is false. diff --git a/prebid-server/developers/add-new-bidder-java.md b/prebid-server/developers/add-new-bidder-java.md index fd9932c95e..37c599308b 100644 --- a/prebid-server/developers/add-new-bidder-java.md +++ b/prebid-server/developers/add-new-bidder-java.md @@ -1251,7 +1251,7 @@ multiformat_supported: will-bid-on-any, will-bid-on-one, will-not-bid ortb_blocking_supported: true/partial/false --- -### Note: +### Registration The Example Bidding adapter requires setup before beginning. Please contact us at setup@example.com @@ -1278,6 +1278,7 @@ Notes on the metadata fields: - If your bidder supports floors, set `floors_supported: true`. No default value. - If you support first party data, you must document what exactly is supported and then you may set `fpd_supported: true`. No default value. - If you support any OpenRTB blocking parameters, you must document what exactly is supported and then you may set `ortb_blocking_supported` to ‘true’,’partial’, or ‘false’. No default value. In order to set ‘true’, you must support: bcat, badv, battr, and bapp. +- Let publishers know how you support multiformat requests -- those with more than one mediatype (e.g. both banner and video). Here are the options: will-bid-on-any, will-bid-on-one, will-not-bid - If you're a member of Prebid.org, add `prebid_member: true`. Default is false. From 56f1ffe41e85dfd88046daeb9d2155cf8c53e194 Mon Sep 17 00:00:00 2001 From: bretg Date: Mon, 3 Oct 2022 15:35:18 -0400 Subject: [PATCH 023/280] AMP user sync tweaks (#4054) --- prebid-server/developers/pbs-cookie-sync.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/prebid-server/developers/pbs-cookie-sync.md b/prebid-server/developers/pbs-cookie-sync.md index d806607537..6150ec00c8 100644 --- a/prebid-server/developers/pbs-cookie-sync.md +++ b/prebid-server/developers/pbs-cookie-sync.md @@ -77,7 +77,7 @@ See [the AMP implementation guide](/dev-docs/show-prebid-ads-on-amp-pages.html#u {: .alert.alert-info :} If the publisher has an AMP Consent Management Platform, they should use `load-cookie-with-consent.html`. -3) At runtime, the `load-cookie` script just calls the Prebid Server /cookie_sync endpoint. The rest works the same as described for Prebid.js above. +3) At runtime, the `load-cookie` script just calls the Prebid Server /cookie_sync endpoint. The rest works similar to what's described for Prebid.js above. One difference is that the bidders are not known on the AMP page so those aren't passed. Another difference is that AMP doesn't support iframe syncs, so load-cookie passes instructions to PBS so only pixel syncs are returned. ### Cooperative Syncing From 076882f3fdcda84dd906c1c2da9725957e9cb8bb Mon Sep 17 00:00:00 2001 From: bretg Date: Tue, 4 Oct 2022 16:44:47 -0400 Subject: [PATCH 024/280] made JSON.parse more robust (#4057) --- dev-docs/modules/consentManagement.md | 4 +++- .../video/crossplayer/flowplayer/pb-cp-flowplayer.html | 10 ++++++++-- .../video/crossplayer/jwplayer/pb-cp-jwplayer.html | 10 ++++++++-- examples/video/crossplayer/kaltura/pb-cp-kaltura.html | 10 ++++++++-- examples/video/crossplayer/videojs/pb-cp-videojs.html | 10 ++++++++-- 5 files changed, 35 insertions(+), 9 deletions(-) diff --git a/dev-docs/modules/consentManagement.md b/dev-docs/modules/consentManagement.md index d0d4ea46f5..45f868fc29 100644 --- a/dev-docs/modules/consentManagement.md +++ b/dev-docs/modules/consentManagement.md @@ -301,7 +301,9 @@ var responseCode; // false if there was an error, else true var json = event.data; var msgIsString = typeof json === "string"; if ( msgIsString ) { - json = JSON.parse(json); + try { + json = JSON.parse(json); + } catch (error) { } } var call = json.__tcfapiCall; if (call) { diff --git a/examples/video/crossplayer/flowplayer/pb-cp-flowplayer.html b/examples/video/crossplayer/flowplayer/pb-cp-flowplayer.html index 3b4b8f4a43..7b18799ba0 100644 --- a/examples/video/crossplayer/flowplayer/pb-cp-flowplayer.html +++ b/examples/video/crossplayer/flowplayer/pb-cp-flowplayer.html @@ -146,7 +146,10 @@

Place this code in the page body.

return new Promise(function(resolve) { var listener = function(event) { if (event && event.data) { - var data = JSON.parse(event.data); + var data = {}; + try { + data = JSON.parse(event.data); + } catch (error) { } if (data.command === 'PPCP:prebidResponse' && data.messageId === messageId) { window.removeEventListener('message', listener); if (data.url && data.url != 'failed') { @@ -214,7 +217,10 @@

Place this code in the page body.

return new Promise(function(resolve) { var listener = function(event) { if (event && event.data) { - var data = JSON.parse(event.data); + var data = {}; + try { + data = JSON.parse(event.data); + } catch (error) { } if (data.command === 'PPCP:prebidResponse' && data.messageId === messageId) { window.removeEventListener('message', listener); if (data.url && data.url != 'failed') { diff --git a/examples/video/crossplayer/jwplayer/pb-cp-jwplayer.html b/examples/video/crossplayer/jwplayer/pb-cp-jwplayer.html index c6b75b5266..6f741b1ed7 100644 --- a/examples/video/crossplayer/jwplayer/pb-cp-jwplayer.html +++ b/examples/video/crossplayer/jwplayer/pb-cp-jwplayer.html @@ -129,7 +129,10 @@

Place this code in the page body.

return new Promise(function(resolve) { var listener = function(event) { if (event && event.data) { - var data = JSON.parse(event.data); + var data = {}; + try { + data = JSON.parse(event.data); + } catch (error) { } if (data.command === 'PPCP:prebidResponse' && data.messageId === messageId) { window.removeEventListener('message', listener); if (data.url && data.url != 'failed') { @@ -196,7 +199,10 @@

Place this code in the page body.

return new Promise(function(resolve) { var listener = function(event) { if (event && event.data) { - var data = JSON.parse(event.data); + var data = {}; + try { + data = JSON.parse(event.data); + } catch (error) { } if (data.command === 'PPCP:prebidResponse' && data.messageId === messageId) { window.removeEventListener('message', listener); if (data.url && data.url != 'failed') { diff --git a/examples/video/crossplayer/kaltura/pb-cp-kaltura.html b/examples/video/crossplayer/kaltura/pb-cp-kaltura.html index 71fceacd90..6aac173d26 100644 --- a/examples/video/crossplayer/kaltura/pb-cp-kaltura.html +++ b/examples/video/crossplayer/kaltura/pb-cp-kaltura.html @@ -158,7 +158,10 @@

Place this code in the page body.

return new Promise(function(resolve) { var listener = function(event) { if (event && event.data) { - var data = JSON.parse(event.data); + var data = {}; + try { + data = JSON.parse(event.data); + } catch (error) { } if (data.command === 'PPCP:prebidResponse' && data.messageId === messageId) { window.removeEventListener('message', listener); if (data.url && data.url != 'failed') { @@ -243,7 +246,10 @@

Place this code in the page body.

return new Promise(function(resolve) { var listener = function(event) { if (event && event.data) { - var data = JSON.parse(event.data); + var data = {}; + try { + data = JSON.parse(event.data); + } catch (error) { } if (data.command === 'PPCP:prebidResponse' && data.messageId === messageId) { window.removeEventListener('message', listener); if (data.url && data.url != 'failed') { diff --git a/examples/video/crossplayer/videojs/pb-cp-videojs.html b/examples/video/crossplayer/videojs/pb-cp-videojs.html index 332216cee9..e180a1df47 100644 --- a/examples/video/crossplayer/videojs/pb-cp-videojs.html +++ b/examples/video/crossplayer/videojs/pb-cp-videojs.html @@ -177,7 +177,10 @@

Place this code in the page body.

return new Promise(function(resolve) { var listener = function(event) { if (event && event.data) { - var data = JSON.parse(event.data); + var data = {}; + try { + data = JSON.parse(event.data); + } catch (error) { } if (data.command === 'PPCP:prebidResponse' && data.messageId === messageId) { window.removeEventListener('message', listener); if (data.url && data.url != 'failed') { @@ -261,7 +264,10 @@

Place this code in the page body.

return new Promise(function(resolve) { var listener = function(event) { if (event && event.data) { - var data = JSON.parse(event.data); + var data = {}; + try { + data = JSON.parse(event.data); + } catch (error) { } if (data.command === 'PPCP:prebidResponse' && data.messageId === messageId) { window.removeEventListener('message', listener); if (data.url && data.url != 'failed') { From 7153a3579b4fd698544a67ad6c07be823a05724c Mon Sep 17 00:00:00 2001 From: southern-growthcode <79725079+southern-growthcode@users.noreply.github.com> Date: Thu, 6 Oct 2022 08:27:00 -0400 Subject: [PATCH 025/280] Update to prebid website for the new GrowthCode UserID Module (#4028) * Update to prebid website for the new GrowthCode UserID Module * Update GrowthCode company description * Rename the ClientId to PartnerID --- dev-docs/modules/userId.md | 43 ++++++++++++++++++++++++++++++++++++++ 1 file changed, 43 insertions(+) diff --git a/dev-docs/modules/userId.md b/dev-docs/modules/userId.md index 59807d7f58..f90871822e 100644 --- a/dev-docs/modules/userId.md +++ b/dev-docs/modules/userId.md @@ -756,6 +756,48 @@ pbjs.setConfig({ | storage.expires | Optional | Integer | How long (in days) the user ID information will be stored. FTrack recommends `90`. | `90` | | storage.refreshInSeconds | Optional | Integer | How many seconds until the FTrack ID will be refreshed. FTrack strongly recommends 8 hours between refreshes | `8*3600` | +### GrowthCode + +[GrowthCode](https://growthcode.io/) offers scaled infrastructure-as-a-service +to empower independent publishers to harness data and take control of +identity and audience while rapidly aligning to industry changes and +margin pressure. + +#### GrowthCode Configuration + +First, make sure to add the GrowthCode submodule to your Prebid.js package with: + +{: .alert.alert-info :} +gulp build --modules=growthCodeIdSystem,userId + +The following configuration parameters are available: + +```javascript +pbjs.setConfig({ + userSync: { + userIds: [{ + name: 'growthCodeId', + params: { + pid: 'TEST01', // Set your Partner ID here for production (obtained from Growthcode) + publisher_id: '_sharedID', + publisher_id_storage: 'html5' + } + }] + } +}); +``` +The following configuration parameters are available: + +{: .table .table-bordered .table-striped } +| Param under userSync.userIds[] | Scope | Type | Description | Example | +|--------------------------------|----------|--------| --- |-----------------| +| name | Required | String | The name of this module. | `"growthCodeId"` | +| params | Required | Object | Details of module params. | | +| params.pid | Required | String | This is the Partner ID value obtained from GrowthCode | `"TEST01"` | +| params.url | Optional | String | Custom URL for server | | +| params.publisher_id | Optional | String | Name if the variable that holds your publisher ID | `"_sharedID"` | +| params.publisher_id_storage | Optional | String | Publisher ID storage (cookie, html5) | `"html5"` | + ### Hadron ID from Audigent Audigent is a next-generation data management platform and a first-of-a-kind "data agency" containing some of the most exclusive content-consuming audiences across desktop, mobile and social platforms. Our HadronId module allows for user id resolution and Audigent user data segmentation to be retrieved for users across the web. For assistance setting up your module please contact us at [prebid@audigent.com](mailto:prebid@audigent.com). @@ -2368,6 +2410,7 @@ Bidders that want to support the User ID module in Prebid.js, need to update the | CriteoID | Criteo | criteoId | criteo.com | "1111" | | Fabrick ID | Neustar | fabrickId | neustar.biz | "1111" | | FLoC ID | n/a | flocId | | | +| GrowthCode ID | GrowthCode | growthCodeId | growthcode.io | "1111" | | Hadron ID | Audigent | hadronId | audigent.com | {"hadronId":"user-hadron-id", "auSeg":["segment1", "segment2"]} | | ID+ | Zeotap | IDP | zeotap.com | "1111" | | ID5 ID | ID5 | id5id | id5-sync.com | {uid: "1111", ext: { linkType: 2, abTestingControlGroup: false } } | From f57ac0ac2d7e1c053c910e94e7d0d9920d3a6981 Mon Sep 17 00:00:00 2001 From: TheMediaGrid <44166371+TheMediaGrid@users.noreply.github.com> Date: Thu, 6 Oct 2022 15:28:22 +0300 Subject: [PATCH 026/280] TheMediaGrid: added native support for s2s adapter only (#4017) * Added doc file for Grid Bid Adapter * update doc for TheMediaGrid Bid Adapter * Added video support in Grid doc file * removing unnecessary front matter * Update doc file for TheMediaGrid Bid Adapter * Added doc file for TheMediaGridNM Bid Adapter * Update doc file for TheMediaGrid Bid Adapter * Update doc file for The Media Grid Bid Adapter * Update THeMediaGrid doc to support TCF 2.0 * Update doc for TheMediaGrid Bid Adapter * Update doc file for TheMediaGrid Bid Adapter * Update doc for TheMediaGrid Bid Adapter * Update TheMediaGrid doc to support coppa * Update GridNM Bid Adapter doc file * TheMediaGrid: update doc * Added alias playewire for TheMediaGrid Bid Adapter * Added some description in TheMediaGrid doc * Added alias adlivetech for TheMediaGrid Bid Adapter * TheMediaGrid: update doc * TheMediaGrid: update docs for gridNM, grid and aliases to support FPD * TrustX: update doc to support FPD * TheMediaGrid: added native suport for s2s only Co-authored-by: bretg --- dev-docs/bidders/grid.md | 46 +++++++++++++++++++++++++++++++++++++++- 1 file changed, 45 insertions(+), 1 deletion(-) diff --git a/dev-docs/bidders/grid.md b/dev-docs/bidders/grid.md index acaee18643..c650155d68 100644 --- a/dev-docs/bidders/grid.md +++ b/dev-docs/bidders/grid.md @@ -5,7 +5,7 @@ description: Prebid TheMediaGrid Bidder Adaptor pbjs: true pbs: true biddercode: grid -media_types: banner, video +media_types: banner, video, native (s2s only) multiformat_supported: will-bid-on-any gdpr_supported: true usp_supported: true @@ -22,6 +22,7 @@ fpd_supported: true - [Bid Params](#grid-bid-params) - [Bidder Config](#grid-bidder-config) - [First Party Data](#grid-first-party) +- [Native setup example (s2s only)](#grid-native-example)
@@ -92,3 +93,46 @@ AdUnit-specific data using `AdUnit.ortb2Imp` supports following fields: - `ortb2.imp[].ext.data.*` - `ortb2.imp[].instl` + + + +### Native setup example (s2s only) + +Setup native in adUnit mediaTypes, for example: +``` +... +mediaTypes: { + native: { + ortb: { + ver: '1.2', + "assets": [ + { + "id": 1, + "img": { + "hmin": 180, + "wmin": 216, + "type": 3 + }, + "required": 1 + }, + { + "title": { + "len": 140 + }, + "id": 2, + "required": 1 + }, + { + "id": 3, + "data": { + "len": 25, + "type": 1 + }, + "required": 1 + } + ], + } + } +}, +... +``` From 60395778cc32b370fc73e935eb1afdc96837edd0 Mon Sep 17 00:00:00 2001 From: Yohan Boutin Date: Thu, 6 Oct 2022 14:43:56 +0200 Subject: [PATCH 027/280] add schain support (#4059) --- dev-docs/bidders/seedtag.md | 1 + 1 file changed, 1 insertion(+) diff --git a/dev-docs/bidders/seedtag.md b/dev-docs/bidders/seedtag.md index 4849714c3e..39a16e7060 100644 --- a/dev-docs/bidders/seedtag.md +++ b/dev-docs/bidders/seedtag.md @@ -5,6 +5,7 @@ description: Prebid Seedtag Bidder Adapter pbjs: true gdpr_supported: true usp_supported: true +schain_supported: true gvl_id: 157 media_types: banner, video biddercode: seedtag From 2e880ce7297b8fc7287487d9d3b29b87fdb845f1 Mon Sep 17 00:00:00 2001 From: Vitali Ioussoupov <84333122+pixfuture-media@users.noreply.github.com> Date: Thu, 6 Oct 2022 15:53:22 -0400 Subject: [PATCH 028/280] Update piximedia.md (#4060) --- dev-docs/bidders/piximedia.md | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/dev-docs/bidders/piximedia.md b/dev-docs/bidders/piximedia.md index cc5072f0cd..4a2696d262 100644 --- a/dev-docs/bidders/piximedia.md +++ b/dev-docs/bidders/piximedia.md @@ -3,6 +3,10 @@ layout: bidder title: Piximedia description: Piximedia Bidder Adaptor pbjs: true +gdpr_supported: true +usp_supported: true +coppa_supported: true +schain_supported: true biddercode: piximedia media_types: banner enable_download: false From 5955b314f6385db14a2a5c749a97d763b8637432 Mon Sep 17 00:00:00 2001 From: Samuel Adu Date: Thu, 6 Oct 2022 22:14:09 +0100 Subject: [PATCH 029/280] Updated ConnectID documentation to aaccount for the Easy Opt-out Toggle mechanism (#4055) Co-authored-by: slimkrazy --- dev-docs/modules/userId.md | 17 +++++++++++++---- 1 file changed, 13 insertions(+), 4 deletions(-) diff --git a/dev-docs/modules/userId.md b/dev-docs/modules/userId.md index f90871822e..b91f9e8027 100644 --- a/dev-docs/modules/userId.md +++ b/dev-docs/modules/userId.md @@ -2297,17 +2297,25 @@ pbjs.setConfig({ Yahoo ConnectID is a person based ID and does not depend on 3rd party cookies. It enables ad tech platforms to recognize and match users consistently across the open web. Built on top of Yahoo’s robust and proprietary ID Graph it delivers a higher find rate of audiences on publishers’ sites user targeting that respects privacy. -Yahoo ConnectID honors privacy choices from the [Yahoo Privacy Dashboard](https://legal.yahoo.com/us/en/yahoo/privacy/dashboard/index.html) as well as global privacy acts. +#### Honoring Privacy Choices -Add support for Yahoo ConnectID to your Prebid.js package with: +Yahoo ConnectID provides multiple mechanisms for users to manage their privacy choices. Users can manage their choices via [ConnectID Control Portal](http://connectid.yahoo.com), on the [Yahoo Privacy Dashboard](https://legal.yahoo.com/us/en/yahoo/privacy/dashboard/index.html) and [NAI’s Audience Matched Opt Out page](https://optout.networkadvertising.org/optout/email). No further actions are required by Publishers as Yahoo will ensure that privacy choices selected by users via one of these methods are honored. We will automatically stop generating ConnectIDs for users who have opted-out. + +When desired, additional privacy control can be provided to your users. Within your privacy policy or website privacy settings, [Create an Easy Opt-in Opt-out Toggle](https://documentation.help.yahooinc.com/platform/SSP/Sellers/Integrate/Create-an-Easy-OptIn-Optout-Toggle.htm) for ConnectID. + +Finally, ConnectID follows all global privacy laws (such as the CCPA) and industry frameworks (such as NAI, DAA and IAB). Yahoo will auto-detect most privacy signals present on the page (including those set by prebid libraries) and not generate a ConnectID for users that have opted-out. -{: .alert.alert-info :} -gulp build --modules=userId,connectIdSystem #### Yahoo ConnectID Registration A Yahoo supplied publisher specific pixel Id is required. Please reach out to your account manager for assistance with setup. +Add support for Yahoo ConnectID to your Prebid.js package with: + +{: .alert.alert-info :} +gulp build --modules=userId,connectIdSystem + + #### Yahoo ConnectID Configuration
@@ -2324,6 +2332,7 @@ A Yahoo supplied publisher specific pixel Id is required. Please reach out to yo {: .table .table-bordered .table-striped }
+ #### Yahoo ConnectID Examples ``` From ef0c91671fb5ef4d0c371a1c67ecfb65ed1779b5 Mon Sep 17 00:00:00 2001 From: Demetrio Girardi Date: Thu, 6 Oct 2022 14:16:17 -0700 Subject: [PATCH 030/280] PBJS: add example on setting custom transactionId (#4061) * PBJS: add example on setting custom transactionId * Update firstPartyData.md Co-authored-by: bretg --- features/firstPartyData.md | 20 +++++++++++++++++++- 1 file changed, 19 insertions(+), 1 deletion(-) diff --git a/features/firstPartyData.md b/features/firstPartyData.md index 29cd6d021b..0ac37049b9 100644 --- a/features/firstPartyData.md +++ b/features/firstPartyData.md @@ -155,7 +155,7 @@ pbjs.addAdUnits({ }, ortb2Imp: { ext: { - data: { + data: { pbadslot: "homepage-top-rect", adUnitSpecificAttribute: "123" } @@ -165,6 +165,24 @@ pbjs.addAdUnits({ }); {% endhighlight %} +You may also specify adUnit-specific transaction IDs using `ortb2Imp.ext.tid`, and Prebid will use them instead of generating random new ones. This is useful if you are auctioning the same slots through multiple header bidding libraries. Note: you must take care to not re-use the same transaction IDs across different ad units or auctions. Here's a simplified example passing a tid through the [requestBids](/dev-docs/publisher-api-reference/requestBids.html) function: + +{% highlight js %} +const tid = crypto.randomUUID(); +pbjs.requestBids({ + adUnits: [{ + code: 'test-div', + // ... + ortb2Imp: { + ext: { + tid: tid + } + } + }] +}); +// reuse `tid` when auctioning `test-div` through some other header bidding wrapper +{% endhighlight %} + {: .alert.alert-info :} Prebid does not support AdUnit-specific **user** data, nor does it support bidder-specific AdUnit First Party Data. You could implement either of From d2488e7438aabbe21b4a1b686591b8d4b41c59f5 Mon Sep 17 00:00:00 2001 From: Andrew Slagle <42588549+spotxslagle@users.noreply.github.com> Date: Thu, 6 Oct 2022 15:22:53 -0600 Subject: [PATCH 031/280] Add documentation for custom rounding functions (#4030) --- dev-docs/publisher-api-reference/setConfig.md | 32 +++++++++++++++++++ 1 file changed, 32 insertions(+) diff --git a/dev-docs/publisher-api-reference/setConfig.md b/dev-docs/publisher-api-reference/setConfig.md index bdd6d62a96..f58c7a6c74 100644 --- a/dev-docs/publisher-api-reference/setConfig.md +++ b/dev-docs/publisher-api-reference/setConfig.md @@ -26,6 +26,7 @@ Core config: + [Set the page URL](#setConfig-Page-URL) + [Set price granularity](#setConfig-Price-Granularity) + [Set media type price granularity](#setConfig-MediaType-Price-Granularity) ++ [Set custom cpm rounding](#setConfig-Cpm-Rounding) + [Configure server-to-server header bidding](#setConfig-Server-to-Server) + [Configure user syncing](#setConfig-Configure-User-Syncing) + [Configure targeting controls](#setConfig-targetingControls) @@ -420,6 +421,37 @@ are recognized. This was driven by the recognition that outstream often shares l If the mediatype is video, the price bucketing code further looks at the context (e.g. outstream) to see if there's a price granularity override. If it doesn't find 'video-outstream' defined, it will then look for just 'video'. +
+ +#### Custom CPM Rounding + +Prebid defaults to rounding down all bids to the nearest increment, which may cause lower CPM ads to be selected. +While this can be addressed through higher [price granularity](#setConfig-Price-Granularity), Prebid also allows setting a custom rounding function. +This function will be used by Prebid to determine what increment a bid will round to. +
+
+You can set a simple rounding function: +```javascript +// Standard rounding +pbjs.setConfig({'cpmRoundingFunction': Math.round}); +``` + +Or you can round according to more complex considerations: + +```javascript +// Custom rounding function +const roundToNearestEvenIncrement = function (number) { + let ceiling = Math.ceil(number); + let ceilingIsEven = ceiling % 2 === 0; + if (ceilingIsEven) { + return ceiling; + } else { + return Math.floor(number); + } +} +pbjs.setConfig({'cpmRoundingFunction': roundToNearestEvenIncrement}); +``` +
#### Server to Server From bd44d0e6dc7c818ea320e9570837e67a901d897e Mon Sep 17 00:00:00 2001 From: Aaron Price <67345931+AaronColbyPrice@users.noreply.github.com> Date: Thu, 6 Oct 2022 14:29:28 -0700 Subject: [PATCH 032/280] Conversant analytics adapter - initial release documentation (#4011) * Conversant Analytics Adapter Documentation * Conversant Analytics Adapter Documentation - code review fix --- dev-docs/analytics/conversant.md | 43 ++++++++++++++++++++++++++++++++ 1 file changed, 43 insertions(+) create mode 100644 dev-docs/analytics/conversant.md diff --git a/dev-docs/analytics/conversant.md b/dev-docs/analytics/conversant.md new file mode 100644 index 0000000000..e0c7712d8e --- /dev/null +++ b/dev-docs/analytics/conversant.md @@ -0,0 +1,43 @@ +--- +layout: analytics +title: Conversant +description: Conversant Prebid Analytics Adapter +modulecode: conversant +gdpr_supported: true +usp_supported: true +coppa_supported: false +prebid_member: true +gvl_id: 24 +enable_download: true +--- + +#### Registration + +Conversant (Epsilon) analytics adapter requires approval from the +Conversant team, even for existing accounts. Please reach out to +publishersupport@epsilon.com for more information. + +#### Analytics Options + +{: .table .table-bordered .table-striped } +| Name | Scope | Description | Example | Type | +|-------------|---------|--------------------|-----------------------------------------------------------------------------------------------------------------------------|-------------------------------------------------------------------------------------|------------------| +| site_id | required | Conversant (Epsilon) site id for the site that will track prebid usage. | 1234 | integer | +| cnvr_sampling | optional | Sample rate for analytics data. Value should be between 0 and 1 (inclusive), 0 == never sample, 1 == always sample, 0.5 == send analytics 50% of the time. | 0.5 | float | + +### Example Configuration + +``` + + pbjs.que.push(function(){ + pbjs.enableAnalytics( + { + provider: 'conversant', + options: { + site_id: 108060, + cnvr_sampling: 0.5 + } + } + ); + }); +``` From 893ebbd193d3ba758fcdbcae73f150b5d367528b Mon Sep 17 00:00:00 2001 From: hamper Date: Fri, 7 Oct 2022 00:30:21 +0300 Subject: [PATCH 033/280] add custom vuukle parameters (#4003) --- dev-docs/bidders/vuukle.md | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/dev-docs/bidders/vuukle.md b/dev-docs/bidders/vuukle.md index e1a9561379..a95ddb5381 100644 --- a/dev-docs/bidders/vuukle.md +++ b/dev-docs/bidders/vuukle.md @@ -4,6 +4,12 @@ title: Vuukle description: vuukle bid adapter pbjs: true biddercode: vuukle +gdpr_supported: true +gvl_id: 1004 +usp_supported: true +coppa_supported: true +schain_supported: true +prebid_member: true --- ### Bid Params From 4f06aec3af74c15e6eb1b8bdcdee7b9b6bc3e1c3 Mon Sep 17 00:00:00 2001 From: Romain Lofaso <1193072+RomainLofaso@users.noreply.github.com> Date: Thu, 6 Oct 2022 23:32:54 +0200 Subject: [PATCH 034/280] OneKey RTD Module & OneKey Id Submodule: initial release (#3948) * Add the OneKey Id sub-module and the OneKey RTD module User Id sub-module: https://github.com/prebid/Prebid.js/pull/8685 RTD module: https://github.com/prebid/Prebid.js/pull/8686 * Update the locations of the OneKey repositories --- dev-docs/modules/oneKeyRtdProvider.md | 147 ++++++++++++++++++++++++++ dev-docs/modules/userId.md | 44 ++++++++ 2 files changed, 191 insertions(+) create mode 100644 dev-docs/modules/oneKeyRtdProvider.md diff --git a/dev-docs/modules/oneKeyRtdProvider.md b/dev-docs/modules/oneKeyRtdProvider.md new file mode 100644 index 0000000000..5e4a15f539 --- /dev/null +++ b/dev-docs/modules/oneKeyRtdProvider.md @@ -0,0 +1,147 @@ +--- +layout: page_v2 +title: OneKey RTD Module +display_name: OneKey RTD Module +description: OneKey Real Time Data Module +page_type: module +module_type: rtd +module_code : oneKeyRtdProvider +enable_download : false +vendor_specific: true +sidebarType : 1 +--- + +# OneKey Data Provider + +{:.no_toc} + +* TOC +{:toc} + +## Overview + +The OneKey real-time data module in Prebid has been built so that publishers +can quickly and easily setup the OneKey Addressability Framework. +This module is used along with the oneKeyIdSystem to pass OneKey data to your partners. +Both modules are required. This module will pass transmission requests to your partners +while the oneKeyIdSystem will pass the oneKeyData. + +Background information: +- [OneKey-Network/addressability-framework](https://github.com/OneKey-Network/addressability-framework) +- [OneKey-Network/OneKey-implementation](https://github.com/OneKey-Network/OneKey-implementation) + + +## Implementation for Publishers + +### Integration + +1) Compile the OneKey RTD Provider and the OneKey UserID sub-module into your Prebid build. + +{: .alert.alert-info :} +gulp build --modules=rtdModule,oneKeyRtdProvider + +2) Publishers must register OneKey RTD Provider as a Real Time Data provider by using `setConfig` +to load a Prebid Config containing a `realTimeData.dataProviders` array: + +```javascript +pbjs.setConfig({ + ..., + realTimeData: { + auctionDelay: 100, + dataProviders: [ + { + name: 'oneKey', + waitForIt: true + } + ] + } +}); +``` + +3) Configure the OneKey RTD Provider with the bidders that are part of the OneKey community. If there is no bidders specified, the RTD provider +will share OneKey data with all adapters. + +⚠️ This module works with a User Id sub-module. Both must be configured. See the [OneKey Id Sub-Module](/dev-docs/modules/userId.html#onekey-ids--preferences). + +### Parameters + +| Name |Type | Description | Notes | +| :------------ | :------------ | :------------ |:------------ | +| name | String | Real time data module name | Always 'oneKey' | +| waitForIt | Boolean | Required to ensure that the auction is delayed until prefetch is complete | Optional. Defaults to false | +| params | Object | | Optional | +| params.bidders | Array | List of bidders to restrict the data to. | Optional | + +## Implementation for Bidders + +### Bidder Requests + +The data will provided to the bidders using the `ortb2` object. +The following is an example of the format of the data: + +```json +"user": { + "ext": { + "paf": { + "transmission": { + "seed": { + "version": "0.1", + "transaction_ids": ["06df6992-691c-4342-bbb0-66d2a005d5b1", "d2cd0aa7-8810-478c-bd15-fb5bfa8138b8"], + "publisher": "cmp.pafdemopublisher.com", + "source": { + "domain": "cmp.pafdemopublisher.com", + "timestamp": 1649712888, + "signature": "turzZlXh9IqD5Rjwh4vWR78pKLrVsmwQrGr6fgw8TPgQVJSC8K3HvkypTV7lm3UaCi+Zzjl+9sd7Hrv87gdI8w==" + } + } + } + } + } +} +``` + +```json +"ortb2Imp": { + "ext": { + "data": { + "paf": { + "transaction_id": "52d23fed-4f50-4c17-b07a-c458143e9d09" + } + } + } +} +``` + +### Bidder Responses + +Bidders who are part of the OneKey Addressability Framework and receive OneKey +transmissions are required to return transmission responses as outlined in +[OneKey-Network/addressability-framework](https://github.com/OneKey-Network/addressability-framework). Transmission responses should be appended to bids +along with the releveant content_id using the meta.paf field. The paf-lib will +be responsible for collecting all of the transmission responses. + +Below is an example of setting a transmission response: + +```javascript +bid.meta.paf = { + content_id: "90141190-26fe-497c-acee-4d2b649c2112", + transmission: { + version: "0.1", + contents: [ + { + transaction_id: "f55a401d-e8bb-4de1-a3d2-fa95619393e8", + content_id: "90141190-26fe-497c-acee-4d2b649c2112" + } + ], + status: "success", + details: "", + receiver: "dsp1.com", + source: { + domain: "dsp1.com", + timestamp: 1639589531, + signature: "d01c6e83f14b4f057c2a2a86d320e2454fc0c60df4645518d993b5f40019d24c" + }, + children: [] + } +} +``` diff --git a/dev-docs/modules/userId.md b/dev-docs/modules/userId.md index b91f9e8027..1a793ff606 100644 --- a/dev-docs/modules/userId.md +++ b/dev-docs/modules/userId.md @@ -2383,6 +2383,50 @@ pbjs.setConfig({ }); {% endhighlight %} +### OneKey IDs & Preferences + +The OneKey real-time data module in Prebid has been built so that publishers +can quickly and easily setup the OneKey Addressability Framework. +This module is used along with the oneKeyRtdProvider to pass OneKey data to your partners. +Both modules are required. This module will pass oneKeyData to your partners +while the oneKeyRtdProvider will pass the transmission requests. + +Background information: +- [OneKey-Network/addressability-framework](https://github.com/OneKey-Network/addressability-framework) +- [OneKey-Network/OneKey-implementation](https://github.com/OneKey-Network/OneKey-implementation) + + +It can be added to you Prebid.js package with: + +{: .alert.alert-info :} +gulp build –modules=userId,oneKeyIdSystem + +⚠️ This module works with a RTD module. Both must be configured. See the [OneKey RTD Module](/dev-docs/modules/oneKeyRtdProvider.html). + +#### OneKey Registration + +OneKey is a community based Framework with a decentralized approach. +Go to [onekey.community](https://onekey.community/) for more details. + +#### OneKey Configuration + +{: .table .table-bordered .table-striped } +| Param under userSync.userIds[] | Scope | Type | Description | Example | +| --- | --- | --- | --- | --- | +| name | Required | String | The name of this module | `"oneKeyData"` | + + +#### OneKey Exemple + +{% highlight javascript %} +pbjs.setConfig({ + userSync: { + userIds: [{ + name: 'oneKeyData' + }] + } +}); +{% endhighlight %} ## Adapters Supporting the User ID Sub-Modules From 287e3094587d139967d479c0caa6787c996859aa Mon Sep 17 00:00:00 2001 From: AndBeyondMediaHB <107686862+AndBeyondMediaHB@users.noreply.github.com> Date: Tue, 11 Oct 2022 16:08:34 +0300 Subject: [PATCH 035/280] AndBeyond.Media adapter: update bidder code (#4018) * add andBeyondMedia adapter * update bidderCode * fix title * update biddercode * biddercode andbeyond.media => andbeyond * updates * updates Co-authored-by: Vlad Isaiko --- dev-docs/bidders/andBeyondMedia.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/dev-docs/bidders/andBeyondMedia.md b/dev-docs/bidders/andBeyondMedia.md index 1d0c936e2c..6aef046f43 100644 --- a/dev-docs/bidders/andBeyondMedia.md +++ b/dev-docs/bidders/andBeyondMedia.md @@ -1,6 +1,6 @@ --- layout: bidder -title: Compass +title: AndBeyond.Media description: Prebid AndBeyond.Media Bidder Adapter biddercode: beyondmedia usp_supported: true @@ -13,7 +13,7 @@ pbjs: true pbs: true --- -### Prebid.JS Bid Params +### Prebid Bid Params {: .table .table-bordered .table-striped } | Name | Scope | Description | Example | Type | From 343ab873a4adcd9c10febbf7bdb417dc90ebd4cf Mon Sep 17 00:00:00 2001 From: bretg Date: Wed, 12 Oct 2022 15:25:10 -0400 Subject: [PATCH 036/280] userid table formatting (#4074) --- dev-docs/modules/userId.md | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/dev-docs/modules/userId.md b/dev-docs/modules/userId.md index 1a793ff606..d68c0e6d19 100644 --- a/dev-docs/modules/userId.md +++ b/dev-docs/modules/userId.md @@ -741,6 +741,7 @@ pbjs.setConfig({ }); ``` +{: .table .table-bordered .table-striped } | Param under userSync.userIds[] | Scope | Type | Description | Example | | :-- | :-- | :-- | :-- | :-- | | name | Required | String | The name of this module: `"FTrack"` | `"FTrack"` | @@ -1950,6 +1951,7 @@ Trustpid is also the brand name of the service, which is provided by Vodafone Sa #### Trustpid configuration +{: .table .table-bordered .table-striped } | Param under userSync.userIds[] | Scope | Type | Description | Example | | --- | --- | --- | --- | --- | | name | Required | String | The name of the module | `"trustpid"` @@ -2270,9 +2272,9 @@ Each publisher’s privacy policy should take UnifiedId 2 into account #### Unified ID 2 Configuration -{: .table .table-bordered .table-striped } The below parameters apply only to the UID 2.0 User ID Module integration. +{: .table .table-bordered .table-striped } | Param under userSync.userIds[] | Scope | Type | Description | Example | | --- | --- | --- | --- | --- | | name | Required | String | ID value for the UID20 module - `"uid2"` | `"uid2"` | From 456cc1e07d9e43e4a481627245694279d8786020 Mon Sep 17 00:00:00 2001 From: Denis Logachov Date: Thu, 13 Oct 2022 16:23:28 +0300 Subject: [PATCH 037/280] Adkernel: updating rtbdemand alias (#4063) * Create rtbdemand_com.md * Delete rtbdemandadk.md * Update headbidding.md * Update adsolut.md * Update audiencemedia.md * Update waardex_ak.md * Update adbite.md * Update houseofpubs.md * Update bcm.md * Update engageadx.md * Update converge.md * Update adomega.md * Update denakop.md * Update rtbanalytica.md * Update unibots.md * Update catapultx.md * Update ergadx.md * Update turktelekom.md * Update felixads.md * Update motionspots.md * Update displayioads.md * Update rtbdemand_com.md * Update sonic_twist.md * Update rtbdemand_com.md * Update headbidding.md * Update adsolut.md * Update audiencemedia.md * Update adsolut.md * Update waardex_ak.md * Update adbite.md * Update houseofpubs.md * Update bcm.md * Update engageadx.md * Update converge.md * Update adomega.md * Update denakop.md * Update rtbanalytica.md * Update unibots.md * Update catapultx.md * Update turktelekom.md * Update felixads.md * Update motionspots.md * Update displayioads.md * Update rtbdemand_com.md * Update sonic_twist.md --- dev-docs/bidders/adbite.md | 12 +++++++++-- dev-docs/bidders/adomega.md | 12 ++++++++--- dev-docs/bidders/adsolut.md | 12 ++++++++++- dev-docs/bidders/audiencemedia.md | 17 +++++++++++++--- dev-docs/bidders/bcm.md | 13 ++++++++++-- dev-docs/bidders/catapultx.md | 14 +++++++++---- dev-docs/bidders/converge.md | 13 ++++++++---- dev-docs/bidders/denakop.md | 12 ++++++++--- dev-docs/bidders/displayioads.md | 11 +++++++---- dev-docs/bidders/engageadx.md | 12 ++++++++--- dev-docs/bidders/ergadx.md | 10 ++++++++-- dev-docs/bidders/felixads.md | 9 +++++++-- dev-docs/bidders/headbidding.md | 15 ++++++++++++-- dev-docs/bidders/houseofpubs.md | 13 ++++++++++-- dev-docs/bidders/motionspots.md | 11 +++++++---- dev-docs/bidders/rtbanalytica.md | 12 ++++++++--- dev-docs/bidders/rtbdemand_com.md | 33 +++++++++++++++++++++++++++++++ dev-docs/bidders/rtbdemandadk.md | 19 ------------------ dev-docs/bidders/sonic_twist.md | 14 ++++++++++--- dev-docs/bidders/turktelekom.md | 12 ++++++++--- dev-docs/bidders/unibots.md | 12 ++++++++--- dev-docs/bidders/waardex_ak.md | 17 +++++++++++++--- 22 files changed, 230 insertions(+), 75 deletions(-) create mode 100644 dev-docs/bidders/rtbdemand_com.md delete mode 100644 dev-docs/bidders/rtbdemandadk.md diff --git a/dev-docs/bidders/adbite.md b/dev-docs/bidders/adbite.md index 07b2aa749f..96f69db5c4 100644 --- a/dev-docs/bidders/adbite.md +++ b/dev-docs/bidders/adbite.md @@ -2,14 +2,22 @@ layout: bidder title: Adbite description: Adbite LLC +biddercode: adbite pbjs: true pbs: false -biddercode: adbite media_types: banner, native, video gdpr_supported: true usp_supported: true +coppa_supported: true +pbs_app_supported: true schain_supported: true -aliasCode : adkernel +userIds: all +fpd_supported: true +prebid_member: false +ortb_blocking_supported: true +multiformat_supported: will-bid-on-one +floors_supported: true +aliasCode: adkernel --- ### Note: diff --git a/dev-docs/bidders/adomega.md b/dev-docs/bidders/adomega.md index 96d8301c51..52ef278d52 100644 --- a/dev-docs/bidders/adomega.md +++ b/dev-docs/bidders/adomega.md @@ -2,16 +2,22 @@ layout: bidder title: adOmega description: adOmega Bidder Adaptor -pbjs: true -pbs: true biddercode: adomega +pbjs: true +pbs: false media_types: banner, native, video gdpr_supported: true usp_supported: true coppa_supported: true pbs_app_supported: true schain_supported: true -aliasCode : adkernel +userIds: all +fpd_supported: true +prebid_member: false +ortb_blocking_supported: true +multiformat_supported: will-bid-on-one +floors_supported: true +aliasCode: adkernel --- ### Note: diff --git a/dev-docs/bidders/adsolut.md b/dev-docs/bidders/adsolut.md index 96b36dd835..abb1cba897 100644 --- a/dev-docs/bidders/adsolut.md +++ b/dev-docs/bidders/adsolut.md @@ -2,11 +2,21 @@ layout: bidder title: adsolut description: Prebid adsolut Bidder Adaptor +biddercode: adsolut pbjs: true +pbs: false media_types: banner, native, video gdpr_supported: true usp_supported: true -biddercode: adsolut +coppa_supported: true +pbs_app_supported: true +schain_supported: true +userIds: all +fpd_supported: true +prebid_member: false +ortb_blocking_supported: true +multiformat_supported: will-bid-on-one +floors_supported: true aliasCode: adkernel --- diff --git a/dev-docs/bidders/audiencemedia.md b/dev-docs/bidders/audiencemedia.md index 67c3b6a83b..eb8c695e12 100644 --- a/dev-docs/bidders/audiencemedia.md +++ b/dev-docs/bidders/audiencemedia.md @@ -2,11 +2,22 @@ layout: bidder title: Audience Media description: Prebid Audience Media Bidder Adaptor +biddercode: audiencemedia pbjs: true -media_types: banner, video +pbs: false +media_types: banner, native, video gdpr_supported: true -biddercode: audiencemedia -aliasCode : adkernel +usp_supported: true +coppa_supported: true +pbs_app_supported: true +schain_supported: true +userIds: all +fpd_supported: true +prebid_member: false +ortb_blocking_supported: true +multiformat_supported: will-bid-on-one +floors_supported: true +aliasCode: adkernel --- ### Bid Params diff --git a/dev-docs/bidders/bcm.md b/dev-docs/bidders/bcm.md index 18b02bcafd..671f595b30 100644 --- a/dev-docs/bidders/bcm.md +++ b/dev-docs/bidders/bcm.md @@ -2,13 +2,22 @@ layout: bidder title: BCM description: BCM Bid Adapter -pbjs: true biddercode: bcm +pbjs: true +pbs: false media_types: banner, native, video gdpr_supported: true usp_supported: true +coppa_supported: true +pbs_app_supported: true schain_supported: true -aliasCode : adkernel +userIds: all +fpd_supported: true +prebid_member: false +ortb_blocking_supported: true +multiformat_supported: will-bid-on-one +floors_supported: true +aliasCode: adkernel --- ### Note: diff --git a/dev-docs/bidders/catapultx.md b/dev-docs/bidders/catapultx.md index abb551bf81..c4320eb39e 100644 --- a/dev-docs/bidders/catapultx.md +++ b/dev-docs/bidders/catapultx.md @@ -2,16 +2,22 @@ layout: bidder title: CatapultX description: CatapultX Bidder Adaptor -pbjs: true -pbs: true biddercode: catapultx -aliasCode : adkernel -media_types: banner, video +pbjs: true +pbs: false +media_types: banner, native, video gdpr_supported: true usp_supported: true coppa_supported: true pbs_app_supported: true schain_supported: true +userIds: all +fpd_supported: true +prebid_member: false +ortb_blocking_supported: true +multiformat_supported: will-bid-on-one +floors_supported: true +aliasCode: adkernel --- ### Bid Params diff --git a/dev-docs/bidders/converge.md b/dev-docs/bidders/converge.md index d4a010aad0..81efd46e4a 100644 --- a/dev-docs/bidders/converge.md +++ b/dev-docs/bidders/converge.md @@ -2,18 +2,23 @@ layout: bidder title: Converge-Digital description: Converge-Digital Bidder Adaptor -pbjs: true -pbs: true biddercode: converge -aliasCode : adkernel +pbjs: true +pbs: false media_types: banner, native, video gdpr_supported: true +gvl_id: 248 usp_supported: true coppa_supported: true pbs_app_supported: true -gvl_id: 248 schain_supported: true userIds: all +fpd_supported: true +prebid_member: false +ortb_blocking_supported: true +multiformat_supported: will-bid-on-one +floors_supported: true +aliasCode: adkernel --- ### Note: diff --git a/dev-docs/bidders/denakop.md b/dev-docs/bidders/denakop.md index 0b390e05e4..546d505911 100644 --- a/dev-docs/bidders/denakop.md +++ b/dev-docs/bidders/denakop.md @@ -2,16 +2,22 @@ layout: bidder title: Denakop description: Denakop Bidder Adaptor -pbjs: true -pbs: true biddercode: denakop +pbjs: true +pbs: false media_types: banner, native, video gdpr_supported: true usp_supported: true coppa_supported: true pbs_app_supported: true schain_supported: true -aliasCode : adkernel +userIds: all +fpd_supported: true +prebid_member: false +ortb_blocking_supported: true +multiformat_supported: will-bid-on-one +floors_supported: true +aliasCode: adkernel --- ### Note: diff --git a/dev-docs/bidders/displayioads.md b/dev-docs/bidders/displayioads.md index 3e599e879d..5ce24057be 100644 --- a/dev-docs/bidders/displayioads.md +++ b/dev-docs/bidders/displayioads.md @@ -2,10 +2,9 @@ layout: bidder title: DisplayioAds description: DisplayioAds Bidder Adaptor -pbjs: true -pbs: true biddercode: displayioads -aliasCode : adkernel +pbjs: true +pbs: false media_types: banner, native, video gdpr_supported: true usp_supported: true @@ -13,8 +12,12 @@ coppa_supported: true pbs_app_supported: true schain_supported: true userIds: all -floors_supported: true fpd_supported: true +prebid_member: false +ortb_blocking_supported: true +multiformat_supported: will-bid-on-one +floors_supported: true +aliasCode: adkernel --- ### Note: diff --git a/dev-docs/bidders/engageadx.md b/dev-docs/bidders/engageadx.md index 9402d71593..ab5205819a 100644 --- a/dev-docs/bidders/engageadx.md +++ b/dev-docs/bidders/engageadx.md @@ -2,16 +2,22 @@ layout: bidder title: EngageADX description: EngageADX Bidder Adaptor -pbjs: true -pbs: true biddercode: engageadx +pbjs: true +pbs: false media_types: banner, native, video gdpr_supported: true usp_supported: true coppa_supported: true pbs_app_supported: true schain_supported: true -aliasCode : adkernel +userIds: all +fpd_supported: true +prebid_member: false +ortb_blocking_supported: true +multiformat_supported: will-bid-on-one +floors_supported: true +aliasCode: adkernel --- ### Note: diff --git a/dev-docs/bidders/ergadx.md b/dev-docs/bidders/ergadx.md index 2aedf405a1..f843daea55 100644 --- a/dev-docs/bidders/ergadx.md +++ b/dev-docs/bidders/ergadx.md @@ -2,16 +2,22 @@ layout: bidder title: eRGADX description: eRGADX Bidder Adaptor +biddercode: ergadx pbjs: true pbs: true -biddercode: ergadx -aliasCode : adkernel media_types: banner, native, video gdpr_supported: true usp_supported: true coppa_supported: true pbs_app_supported: true schain_supported: true +userIds: all +fpd_supported: true +prebid_member: false +ortb_blocking_supported: true +multiformat_supported: will-bid-on-one +floors_supported: true +aliasCode: adkernel --- ### Note: diff --git a/dev-docs/bidders/felixads.md b/dev-docs/bidders/felixads.md index 9bc6ed33c7..c0f3b25c76 100644 --- a/dev-docs/bidders/felixads.md +++ b/dev-docs/bidders/felixads.md @@ -2,10 +2,9 @@ layout: bidder title: felixads description: Prebid felixads Bidder Adaptor +biddercode: felixads pbjs: true pbs: false -biddercode: felixads -aliascode: adkernel media_types: banner, native, video gdpr_supported: true usp_supported: true @@ -13,6 +12,12 @@ coppa_supported: true pbs_app_supported: true schain_supported: true userIds: all +fpd_supported: true +prebid_member: false +ortb_blocking_supported: true +multiformat_supported: will-bid-on-one +floors_supported: true +aliasCode: adkernel --- ### Note: diff --git a/dev-docs/bidders/headbidding.md b/dev-docs/bidders/headbidding.md index bcdab3d642..ffb5edb640 100644 --- a/dev-docs/bidders/headbidding.md +++ b/dev-docs/bidders/headbidding.md @@ -7,9 +7,20 @@ top_nav_section: dev_docs nav_section: reference pbjs: true - +pbs: false biddercode: headbidding - +media_types: banner, native, video +gdpr_supported: true +usp_supported: true +coppa_supported: true +pbs_app_supported: true +schain_supported: true +userIds: all +fpd_supported: true +prebid_member: false +ortb_blocking_supported: true +multiformat_supported: will-bid-on-one +floors_supported: true aliasCode : adkernel diff --git a/dev-docs/bidders/houseofpubs.md b/dev-docs/bidders/houseofpubs.md index fa8fd70c61..4965d687bb 100644 --- a/dev-docs/bidders/houseofpubs.md +++ b/dev-docs/bidders/houseofpubs.md @@ -2,13 +2,22 @@ layout: bidder title: HouseOfPubs description: House of Pubs Bid Adapter -pbjs: true biddercode: houseofpubs +pbjs: true +pbs: false media_types: banner, native, video gdpr_supported: true usp_supported: true +coppa_supported: true +pbs_app_supported: true schain_supported: true -aliasCode : adkernel +userIds: all +fpd_supported: true +prebid_member: false +ortb_blocking_supported: true +multiformat_supported: will-bid-on-one +floors_supported: true +aliasCode: adkernel --- ### Note: diff --git a/dev-docs/bidders/motionspots.md b/dev-docs/bidders/motionspots.md index e08e862e65..def9836e32 100644 --- a/dev-docs/bidders/motionspots.md +++ b/dev-docs/bidders/motionspots.md @@ -2,10 +2,9 @@ layout: bidder title: Motionspots description: Motionspots Bidder Adaptor -pbjs: true -pbs: true biddercode: motionspots -aliasCode : adkernel +pbjs: true +pbs: false media_types: banner, native, video gdpr_supported: true usp_supported: true @@ -13,8 +12,12 @@ coppa_supported: true pbs_app_supported: true schain_supported: true userIds: all -floors_supported: true fpd_supported: true +prebid_member: false +ortb_blocking_supported: true +multiformat_supported: will-bid-on-one +floors_supported: true +aliasCode: adkernel --- ### Note: diff --git a/dev-docs/bidders/rtbanalytica.md b/dev-docs/bidders/rtbanalytica.md index 3718ed244b..fb6808661b 100644 --- a/dev-docs/bidders/rtbanalytica.md +++ b/dev-docs/bidders/rtbanalytica.md @@ -2,16 +2,22 @@ layout: bidder title: RtbAnalytica description: RtbAnalytica Bidder Adaptor -pbjs: true -pbs: true biddercode: rtbanalytica -aliasCode : adkernel +pbjs: true +pbs: false media_types: banner, native, video gdpr_supported: true usp_supported: true coppa_supported: true pbs_app_supported: true schain_supported: true +userIds: all +fpd_supported: true +prebid_member: false +ortb_blocking_supported: true +multiformat_supported: will-bid-on-one +floors_supported: true +aliasCode: adkernel --- ### Note: diff --git a/dev-docs/bidders/rtbdemand_com.md b/dev-docs/bidders/rtbdemand_com.md new file mode 100644 index 0000000000..27acd76552 --- /dev/null +++ b/dev-docs/bidders/rtbdemand_com.md @@ -0,0 +1,33 @@ +--- +layout: bidder +title: RtbDemand.com +description: Prebid RtbDemand.com Bidder Adaptor +biddercode: rtbdemand_com +pbjs: true +pbs: false +media_types: banner, native, video +gdpr_supported: true +usp_supported: true +coppa_supported: true +pbs_app_supported: true +schain_supported: true +userIds: all +fpd_supported: true +prebid_member: false +ortb_blocking_supported: true +multiformat_supported: will-bid-on-one +floors_supported: true +aliasCode: adkernel +--- + +### Note: + +The RtbDemand.com bidding adaptor requires setup and approval before beginning. Please reach out to for more details + +### Bid Params + +{: .table .table-bordered .table-striped } +| Name | Scope | Description | Example | Type | +|----------|----------|-----------------------|---------------------------|----------| +| `host` | required | Our Host | `' cpm.rtbdemand.com'` | `string` | +| `zoneId` | required | Example RTB zone id | `'12345'` | `string` | diff --git a/dev-docs/bidders/rtbdemandadk.md b/dev-docs/bidders/rtbdemandadk.md deleted file mode 100644 index 76fda18e01..0000000000 --- a/dev-docs/bidders/rtbdemandadk.md +++ /dev/null @@ -1,19 +0,0 @@ ---- -layout: bidder -title: Rtbdemandadk -description: Prebid RtbdemandAdk Bidder Adaptor -pbjs: true -biddercode: rtbdemandadk ---- - -### Note: - -The RtbdemandAdk Bidding adaptor requires setup and approval before beginning. Please reach out to for more details - -### Bid Params - -{: .table .table-bordered .table-striped } -| Name | Scope | Description | Example | Type | -|----------|----------|-----------------------|---------------------------|----------| -| `host` | required | Ad network's RTB host | `'cpm.metaadserving.com'` | `string` | -| `zoneId` | required | RTB zone id | `'30164'` | `string` | diff --git a/dev-docs/bidders/sonic_twist.md b/dev-docs/bidders/sonic_twist.md index 966fc2a4ed..288beb0508 100644 --- a/dev-docs/bidders/sonic_twist.md +++ b/dev-docs/bidders/sonic_twist.md @@ -2,14 +2,22 @@ layout: bidder title: Sonic Twist Media description: Sonic Twist Media -pbjs: true -pbs: true biddercode: sonic_twist +pbjs: true +pbs: false media_types: banner, native, video gdpr_supported: true usp_supported: true +coppa_supported: true +pbs_app_supported: true schain_supported: true -aliasCode : adkernel +userIds: all +fpd_supported: true +prebid_member: false +ortb_blocking_supported: true +multiformat_supported: will-bid-on-one +floors_supported: true +aliasCode: adkernel --- ### Note: diff --git a/dev-docs/bidders/turktelekom.md b/dev-docs/bidders/turktelekom.md index 5a5bdc0be1..3ef5bd8b12 100644 --- a/dev-docs/bidders/turktelekom.md +++ b/dev-docs/bidders/turktelekom.md @@ -2,16 +2,22 @@ layout: bidder title: Türk Telekom description: Türk Telekom Bidder Adaptor -pbjs: true -pbs: true biddercode: turktelekom -aliasCode : adkernel +pbjs: true +pbs: false media_types: banner, native, video gdpr_supported: true usp_supported: true coppa_supported: true pbs_app_supported: true schain_supported: true +userIds: all +fpd_supported: true +prebid_member: false +ortb_blocking_supported: true +multiformat_supported: will-bid-on-one +floors_supported: true +aliasCode: adkernel safeframes_ok: true --- diff --git a/dev-docs/bidders/unibots.md b/dev-docs/bidders/unibots.md index d8b859e629..35eb371611 100644 --- a/dev-docs/bidders/unibots.md +++ b/dev-docs/bidders/unibots.md @@ -2,16 +2,22 @@ layout: bidder title: Unibots description: Unibots Bidder Adaptor -pbjs: true -pbs: true biddercode: unibots -aliasCode : adkernel +pbjs: true +pbs: false media_types: banner, native, video gdpr_supported: true usp_supported: true coppa_supported: true pbs_app_supported: true schain_supported: true +userIds: all +fpd_supported: true +prebid_member: false +ortb_blocking_supported: true +multiformat_supported: will-bid-on-one +floors_supported: true +aliasCode: adkernel --- ### Note: diff --git a/dev-docs/bidders/waardex_ak.md b/dev-docs/bidders/waardex_ak.md index f58274d1c2..0992b37e86 100644 --- a/dev-docs/bidders/waardex_ak.md +++ b/dev-docs/bidders/waardex_ak.md @@ -2,11 +2,22 @@ layout: bidder title: WaardeX description: Prebid WaardeX Bidder Adaptor - biddercode: waardex_ak -aliasCode: adkernel -media_types: display, video +pbjs: true +pbs: false +media_types: banner, native, video gdpr_supported: true +usp_supported: true +coppa_supported: true +pbs_app_supported: true +schain_supported: true +userIds: all +fpd_supported: true +prebid_member: false +ortb_blocking_supported: true +multiformat_supported: will-bid-on-one +floors_supported: true +aliasCode: adkernel --- ### Note: From f892d3045d165eea8bf2f6781ab2932950eb9e79 Mon Sep 17 00:00:00 2001 From: Patrick McCann Date: Thu, 13 Oct 2022 10:13:47 -0400 Subject: [PATCH 038/280] Update consumable.md (#4068) --- dev-docs/bidders/consumable.md | 3 +++ 1 file changed, 3 insertions(+) diff --git a/dev-docs/bidders/consumable.md b/dev-docs/bidders/consumable.md index 38da15ae05..11a570d1c9 100644 --- a/dev-docs/bidders/consumable.md +++ b/dev-docs/bidders/consumable.md @@ -19,6 +19,9 @@ floors_supported: true ### Note: The Consumable adaptor requires setup and approval from your Consumable account manager, even for existing Consumable publishers. Please reach out to your account manager to enable Prebid.js for your account. +### Disclosure: +The Consumable bid adapter may cycle the ad initially shown with a new one at various intervals. This means the advertiser meta-data accompanying the bid response may be incomplete at the time of response. + ### Bid Params {: .table .table-bordered .table-striped } From f4455d5e3e2b185486624fa6e4103cca0006d8a4 Mon Sep 17 00:00:00 2001 From: Demetrio Girardi Date: Thu, 13 Oct 2022 07:26:36 -0700 Subject: [PATCH 039/280] PBJS: document fpdEnrichment ua client hints support (#4050) --- dev-docs/modules/enrichmentFpdModule.md | 20 +++++++++++++++++++- 1 file changed, 19 insertions(+), 1 deletion(-) diff --git a/dev-docs/modules/enrichmentFpdModule.md b/dev-docs/modules/enrichmentFpdModule.md index 3a8d60a0c1..7576cc8009 100644 --- a/dev-docs/modules/enrichmentFpdModule.md +++ b/dev-docs/modules/enrichmentFpdModule.md @@ -22,7 +22,7 @@ gulp build --modules=enrichmentFpdModule If included in the build, it will automatically perform the enrichments unless controlled with setConfig: -``` +```javascript pbjs.setConfig({ firstPartyData: { skipEnrichments: true // defaults to false @@ -45,9 +45,27 @@ At the beginning of each auction, this module merges a number of values into the | aggregated domain | site.publisher.domain | The highest level domain in which cookies can be set. | | viewport width | device.w | Hunts for window.innerWidth, window.document.documentElement.clientWidth, window.document.body.clientWidth | | viewport height | device.w | Hunts for window.innerHeight, window.document.documentElement.clientHeight, window.document.body.clientHeight | +| UA client hints | device.sua | Collects user agent client hints. See [note](#ua-hints) below. | | meta keywords | site.keywords | Looks for a meta tag. e.g. | | currency | cur | Collects the currency defined by the [Currency module](/dev-docs/modules/currency.html). | + +### User agent client hints + +The module populates `device.sua` with UA client hints retrieved from `navigator.userAgentData`. By default, it asks for [every available high entropy hint](https://developer.mozilla.org/en-US/docs/Web/API/NavigatorUAData#returning_high_entropy_values); you may specify the list of hints with the `uaHints` option: + +```javascript +pbjs.setConfig({ + firstPartyData: { + uaHints: [ + 'platform', + // ... + ] + } +}) +``` + +If `uaHints` is set to an empty array, the module will not attempt to retrieve any high entropy hint and use only the available low-entropy values. # Related Reading - [Prebid.js First Party Data feature](/features/firstPartyData.html) From 8bee497f0e1eecbacdc91c8ab7281c7fbe463260 Mon Sep 17 00:00:00 2001 From: bretg Date: Thu, 13 Oct 2022 15:31:07 -0400 Subject: [PATCH 040/280] adding app.ext.prebid to extension table (#4078) --- prebid-server/endpoints/openrtb2/pbs-endpoint-auction.md | 2 ++ 1 file changed, 2 insertions(+) diff --git a/prebid-server/endpoints/openrtb2/pbs-endpoint-auction.md b/prebid-server/endpoints/openrtb2/pbs-endpoint-auction.md index 86345d07ed..c64f316d3c 100644 --- a/prebid-server/endpoints/openrtb2/pbs-endpoint-auction.md +++ b/prebid-server/endpoints/openrtb2/pbs-endpoint-auction.md @@ -1518,6 +1518,8 @@ The Prebid SDK version comes from: | ext.prebid.server | additional Prebid Server metadata | object | yes | | ext.prebid.floors | PBS floors data | object | no | | imp.ext.prebid.adunitcode | Prebid.js adunit code | string | yes | +| app.ext.prebid.source | The client that created this ORTB. Normally "prebid-mobile" | string | yes | +| app.ext.prebid.version | The version of the client that created this ORTB. e.g. "1.1" | string | yes | #### Response {:.no_toc} From 6d62433ef883d01f50d781b8f68e1ad82d8bb326 Mon Sep 17 00:00:00 2001 From: github-tom-kuhnen <101572885+github-tom-kuhnen@users.noreply.github.com> Date: Sun, 16 Oct 2022 02:36:31 +0200 Subject: [PATCH 041/280] Update documentation for the new Teads User Id Module (#4026) --- dev-docs/modules/userId.md | 50 +++++++++++++++++++++++++++++++++++++- download.md | 3 +++ 2 files changed, 52 insertions(+), 1 deletion(-) diff --git a/dev-docs/modules/userId.md b/dev-docs/modules/userId.md index d68c0e6d19..96f40052f9 100644 --- a/dev-docs/modules/userId.md +++ b/dev-docs/modules/userId.md @@ -89,7 +89,7 @@ The table below has the options that are common across ID systems. See the secti {: .table .table-bordered .table-striped } | Param under userSync.userIds[] | Scope | Type | Description | Example | | --- | --- | --- | --- | --- | -| name | Required | String | May be: `"33acrossId"`, `"admixerId"`, `"qid"`, `"adtelligentId"`, `"amxId"`, `"britepoolId"`, `"criteo"`, `"fabrickId"`, `"hadronId"`, `"id5id"`, `identityLink`, `"idx"`, `"intentIqId"`, `"justId"`, `"liveIntentId"`, `"lotamePanoramaId"`, `"merkleId"`, `"naveggId"`, `"mwOpenLinkId"`, `"netId"`, `"novatiqId"`, `"parrableId"`, `"quantcastId"`, `"pubProvidedId"`, `"sharedId"`, `"tapadId"`, `"unifiedId"`,`"uid2"`, `"verizonMediaId"`, `"zeotapIdPlus"` | `"unifiedId"` +| name | Required | String | May be: `"33acrossId"`, `"admixerId"`, `"qid"`, `"adtelligentId"`, `"amxId"`, `"britepoolId"`, `"criteo"`, `"fabrickId"`, `"hadronId"`, `"id5id"`, `identityLink`, `"idx"`, `"intentIqId"`, `"justId"`, `"liveIntentId"`, `"lotamePanoramaId"`, `"merkleId"`, `"naveggId"`, `"mwOpenLinkId"`, `"netId"`, `"novatiqId"`, `"parrableId"`, `"quantcastId"`, `"pubProvidedId"`, `"sharedId"`, `"tapadId"`, `"teadsId"`, `"unifiedId"`,`"uid2"`, `"verizonMediaId"`, `"zeotapIdPlus"` | `"unifiedId"` | params | Based on User ID sub-module | Object | | | | bidders | Optional | Array of Strings | An array of bidder codes to which this user ID may be sent. | `['bidderA', 'bidderB']` | | storage | Optional | Object | The publisher can specify some kind of local storage in which to store the results of the call to get the user ID. This can be either cookie or HTML5 storage. This is not needed when `value` is specified or the ID system is managing its own storage | | @@ -2162,6 +2162,53 @@ pbjs.setConfig({ }); {% endhighlight %} +### Teads ID + +The Teads ID is a first-party identifier designed for publishers using the Teads adapter. For more information please contact [innov-ssp@teads.com](innov-ssp@teads.com) + +#### Teads ID Configuration + +First, add the Teads ID module to your Prebid.js build: + +```shell +gulp build --modules=userId,teadsIdSystem +``` + +Then configure the teadsId in your `userSync` configuration. + +{: .table .table-bordered .table-striped } +| Param under userSync.userIds[] | Scope | Type | Description | Example | +| --- | --- | --- | --- | --- | +| name | Required | String | `"teadsId"` | `"teadsId"` | +| params | Required | Object | Details for Teads initialization. | | +| params.pubId | Required | Number | Teads Publisher Id provided by Teads | 1234 | + +Replace the `pubId` value by your Publisher Teads Id that you will find in TODO + +#### Teads ID Example + +```javascript +pbjs.setConfig({ + userSync: { + userIds: [{ + name: 'teadsId', + params: { + pubId: 1234 + } + }] + } +}); +``` + +This will add a `userId.teadsId` property to all bidRequests. This will be read by the Teads bid adapter, and any other adapters that support EIDs: + +```javascript +{ + teadsId: '2e3a00de-3800-11ed-a261-0242ac120002' +} +``` + + ### Unified ID The Unified ID solution is provided by adsrvr.org and the Trade Desk. @@ -2484,6 +2531,7 @@ Bidders that want to support the User ID module in Prebid.js, need to update the | PubProvided ID | n/a | pubProvidedId | publisher domain | "1111" | | Quantcast ID | n/a | quantcastId | quantcast.com | "1111" | | Tapad ID | Tapad | tapadId | tapad.com | "1111" | +| Teads ID | Teads | teadsId | teads.com | "1111" | | SharedID (PBJS 5.x) | n/a | pubcid | pubcid.org | "1111" | | SharedID (PBJS 4.x)| Prebid | sharedid | sharedid.org | {"id":"01EAJWWN...", "third":"01EAJ..."} | | Unified ID | Trade Desk | tdid | adserver.org | "1111" | diff --git a/download.md b/download.md index f02ac36a1b..50ede08d8c 100644 --- a/download.md +++ b/download.md @@ -344,6 +344,9 @@ These modules may require accounts with a service provider.
+ +
+
From 05da6e3175ba20358dd31bf73c660de539eb5f8e Mon Sep 17 00:00:00 2001 From: Mehdi Bouallagui <45876988+mbouallagui@users.noreply.github.com> Date: Mon, 17 Oct 2022 10:10:45 +0200 Subject: [PATCH 042/280] updating Ogury Bidder documentation (#4079) --- dev-docs/bidders/ogury.md | 24 +++++++++++++++++++++--- 1 file changed, 21 insertions(+), 3 deletions(-) diff --git a/dev-docs/bidders/ogury.md b/dev-docs/bidders/ogury.md index a1ae8c5f42..4268a5c32c 100644 --- a/dev-docs/bidders/ogury.md +++ b/dev-docs/bidders/ogury.md @@ -17,14 +17,32 @@ pbjs: true pbs: false prebid_member: false --- -### Note: +### Registration -The Ogury Bidding adapter requires setup before start of usage: some configuration & account creation needs to be done. Please contact us at web.inventory@ogury.co + Before Ogury's adapter integration, you have to register an account in the Ogury Platform. Please contact if you're interested in a partnership. +If you already have an account you'll need to register your websites (= assets) and the placements (= ad units) within the Platform. Alternatively reach out to your POC within Ogury to assist you with the placement creation. +A detailed overview about the integration process can be found in [this documentation](https://ogury-ltd.gitbook.io/mobile-web/header-bidding/ogury-prebid.js-adapter-integration). -### Bid Params + After this registration, you will receive the Asset IDs and Ad Unit IDs to start the integration. + +### Mandatory bid Params +The minimal list of bid params is: {: .table .table-bordered .table-striped } | Name | Scope | Description | Example | Type | |---------------|----------|-----------------------|-----------|-----------| | `assetKey` | required | The asset key provided by Ogury | `'OGY-CA41D116484F'` | `string` | | `adUnitId` | required | Your ad unit id configured with Ogury | `'2c4d61d0-90aa-0139-0cda-0242ac120004'` | `string` | + +### Optional bid Params +The minimal list of bid params is: + +{: .table .table-bordered .table-striped } +| Name | Scope | Description | Example | Type | +|----------------|----------|-----------------------|-----------|-----------| +| `skipSizeCheck`| optional |By default, the sizes field must include [1,1]. Otherwise the Ogury Bidder doesn't participate in the auction. However, if it isn't possible for some reasons to include it, you may use this option to enable bidding even on other sizes.| `true` | `boolean` | + +Depending on your advertising format needs, other optional parameters can be used. Supported parameters are detailed [here](https://ogury-ltd.gitbook.io/mobile-web/header-bidding/ogury-prebid.js-adapter-integration#optional-configuration). + +## How to contact us +If you have any technical concerns or questions about the adapter, please contact . \ No newline at end of file From 82161af9a8fcf3ec461701bf7d97af1860e9eb81 Mon Sep 17 00:00:00 2001 From: vrtcal-dev <50931150+vrtcal-dev@users.noreply.github.com> Date: Mon, 17 Oct 2022 19:07:56 -0500 Subject: [PATCH 043/280] Added support for 3rd party user IDs (#4072) Co-authored-by: Ubuntu --- dev-docs/bidders/vrtcal.md | 1 + 1 file changed, 1 insertion(+) diff --git a/dev-docs/bidders/vrtcal.md b/dev-docs/bidders/vrtcal.md index b1f33622d2..d0e63971e2 100644 --- a/dev-docs/bidders/vrtcal.md +++ b/dev-docs/bidders/vrtcal.md @@ -11,6 +11,7 @@ usp_supported: true schain_supported: true coppa_supported: true gvl_id: 706 +userIds: all --- ### Bid Params From a3ad68ea81caf4ce7b0eb2ed1d4fbb39b48d42a5 Mon Sep 17 00:00:00 2001 From: Demetrio Girardi Date: Mon, 17 Oct 2022 17:08:46 -0700 Subject: [PATCH 044/280] PBJS: Document new `bidRejected` event (#4066) --- dev-docs/publisher-api-reference/getEvents.md | 1 + 1 file changed, 1 insertion(+) diff --git a/dev-docs/publisher-api-reference/getEvents.md b/dev-docs/publisher-api-reference/getEvents.md index 64c0752206..7317475632 100644 --- a/dev-docs/publisher-api-reference/getEvents.md +++ b/dev-docs/publisher-api-reference/getEvents.md @@ -29,6 +29,7 @@ The available events are: | beforeBidderHttp | bidder network request is about be triggered | Array of Bid request objects | | bidRequested | A bid was requested from a specific bidder | Bid request object | | bidResponse | A bid response has arrived | Bid response object | +| bidRejected | A bid was rejected | Bid response object | | bidAdjustment | A bid was adjusted | Bid response object | | bidWon | A bid has won | Bid response object | | bidTimeout | A bid timed out | Array of objects with timed out bids | From 6b7688c0557a4399cced277442a655e161cec67b Mon Sep 17 00:00:00 2001 From: Jean Stemp <38964447+jeanstemp@users.noreply.github.com> Date: Wed, 19 Oct 2022 06:59:27 -0700 Subject: [PATCH 045/280] Header bidding and Prebid intros (#4077) * Header biddig and Prebid intros * a few tweaks to prebid-intro * tiny tweak to hb-intro * centered images * added links to sincera Co-authored-by: Jean Stemp Co-authored-by: bretg --- _assets/sass/components/_pb.scss | 6 + _data/sidebar.yml | 23 +- _layouts/home.html | 2 +- assets/css/main-bundle.css | 10043 +--------------- assets/images/intros/ad-server-black-box.png | Bin 0 -> 21194 bytes assets/images/intros/header-bidding-intro.png | Bin 0 -> 28439 bytes assets/images/intros/prebid-benefits.png | Bin 0 -> 49945 bytes assets/images/intros/prebid-intro.png | Bin 0 -> 33570 bytes assets/images/intros/top-header-providers.png | Bin 0 -> 63466 bytes overview/intro-to-header-bidding.md | 115 + overview/intro.md | 201 +- 11 files changed, 258 insertions(+), 10132 deletions(-) create mode 100644 assets/images/intros/ad-server-black-box.png create mode 100644 assets/images/intros/header-bidding-intro.png create mode 100644 assets/images/intros/prebid-benefits.png create mode 100644 assets/images/intros/prebid-intro.png create mode 100644 assets/images/intros/top-header-providers.png create mode 100644 overview/intro-to-header-bidding.md diff --git a/_assets/sass/components/_pb.scss b/_assets/sass/components/_pb.scss index a6024cc1da..9033387d5d 100644 --- a/_assets/sass/components/_pb.scss +++ b/_assets/sass/components/_pb.scss @@ -151,3 +151,9 @@ @extend .table-bordered; @extend .table-striped; } + +.center-image +{ + margin: 0 auto; + display: block; +} diff --git a/_data/sidebar.yml b/_data/sidebar.yml index 97b9747c92..0854b2e699 100644 --- a/_data/sidebar.yml +++ b/_data/sidebar.yml @@ -20,7 +20,15 @@ subgroup: 0 - sbSecId: 0 - title: What is Prebid? + title: Intro to Header Bidding + link: /overview/intro-to-header-bidding.html + isHeader: 0 + isSectionHeader: 0 + sectionTitle: + subgroup: 0 + +- sbSecId: 0 + title: Intro to Prebid link: /overview/intro.html isHeader: 0 isSectionHeader: 0 @@ -668,7 +676,7 @@ isSectionHeader: 0 sectionTitle: subgroup: 1 - + - sbSecId: 2 title: Integration with AppLovin MAX link: /prebid-mobile/modules/rendering/ios-sdk-integration-max.html @@ -684,7 +692,7 @@ isSectionHeader: 0 sectionTitle: subgroup: 1 - + - sbSecId: 2 title: Ad Experience Controls link: /prebid-mobile/modules/rendering/ios-sdk-customization-controls.html @@ -733,7 +741,7 @@ isSectionHeader: 0 sectionTitle: subgroup: 1 - + - sbSecId: 2 title: Integration with AppLovin MAX link: /prebid-mobile/modules/rendering/android-sdk-integration-max.html @@ -749,7 +757,7 @@ isSectionHeader: 0 sectionTitle: subgroup: 1 - + - sbSecId: 2 title: Ad Experience Controls link: /prebid-mobile/modules/rendering/android-sdk-customization-controls.html @@ -774,7 +782,7 @@ isSectionHeader: 0 sectionTitle: subgroup: 1 - + - sbSecId: 2 title: Mediation Group - AdMob link: /prebid-mobile/modules/rendering/rendering-admob-line-item-setup.html @@ -782,7 +790,7 @@ isSectionHeader: 0 sectionTitle: subgroup: 1 - + - sbSecId: 2 title: Custom Network - MAX link: /prebid-mobile/modules/rendering/rendering-max-line-item-setup.html @@ -2334,4 +2342,3 @@ isSectionHeader: 0 sectionTitle: subgroup: 0 - diff --git a/_layouts/home.html b/_layouts/home.html index deff5f082a..f4c9540d73 100644 --- a/_layouts/home.html +++ b/_layouts/home.html @@ -9,7 +9,7 @@

Prebid Documentation

-

Welcome to the Prebid.org technical documentation portal. Here you will find the help you need to work with the Prebid.org family of products. Visit Prebid.org for general product overviews, blog updates, and additional information on membership and events. If you're wondering what Prebid and Header Bidding are all about, check out Why Prebid?

+

Welcome to the Prebid.org technical documentation portal. Here you will find the help you need to work with the Prebid.org family of products. Visit Prebid.org for general product overviews, blog updates, and additional information on membership and events. If you're wondering what Header Bidding is all about, check out our Introduction to Header Bidding

diff --git a/assets/css/main-bundle.css b/assets/css/main-bundle.css index f88c219e7e..f9128d2ef2 100644 --- a/assets/css/main-bundle.css +++ b/assets/css/main-bundle.css @@ -1,10042 +1 @@ -.awesomplete [hidden] { - display: none; -} - -.awesomplete .visually-hidden { - position: absolute; - clip: rect(0, 0, 0, 0); -} - -.awesomplete { - display: inline-block; - position: relative; -} - -.awesomplete > input { - display: block; -} - -.awesomplete > ul { - position: absolute; - left: 0; - z-index: 1; - min-width: 100%; - box-sizing: border-box; - list-style: none; - padding: 0; - margin: 0; - background: #fff; -} - -.awesomplete > ul:empty { - display: none; -} -@charset "UTF-8"; - -*, -*::before, -*::after { - box-sizing: border-box; -} - -html { - font-family: sans-serif; - line-height: 1.15; - -webkit-text-size-adjust: 100%; - -webkit-tap-highlight-color: rgba(0, 0, 0, 0); -} - -article, -aside, -figcaption, -figure, -footer, -header, -hgroup, -main, -nav, -section { - display: block; -} - -body { - margin: 0; - font-family: -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, "Helvetica Neue", Arial, "Noto Sans", sans-serif, "Apple Color Emoji", "Segoe UI Emoji", "Segoe UI Symbol", "Noto Color Emoji"; - font-size: 1rem; - font-weight: 400; - line-height: 1.5; - color: #212529; - text-align: left; - background-color: #eceeef; -} - -[tabindex="-1"]:focus:not(:focus-visible) { - outline: 0 !important; -} - -hr { - box-sizing: content-box; - height: 0; - overflow: visible; -} - -h1, -h2, -h3, -h4, -h5, -h6 { - margin-top: 0; - margin-bottom: 0.5rem; -} - -p { - margin-top: 0; - margin-bottom: 1rem; -} - -abbr[title], -abbr[data-original-title] { - text-decoration: underline; - -webkit-text-decoration: underline dotted; - text-decoration: underline dotted; - cursor: help; - border-bottom: 0; - -webkit-text-decoration-skip-ink: none; - text-decoration-skip-ink: none; -} - -address { - margin-bottom: 1rem; - font-style: normal; - line-height: inherit; -} - -ol, -ul, -dl { - margin-top: 0; - margin-bottom: 1rem; -} - -ol ol, -ul ul, -ol ul, -ul ol { - margin-bottom: 0; -} - -dt { - font-weight: 700; -} - -dd { - margin-bottom: 0.5rem; - margin-left: 0; -} - -blockquote { - margin: 0 0 1rem; -} - -b, -strong { - font-weight: bolder; -} - -small { - font-size: 80%; -} - -sub, -sup { - position: relative; - font-size: 75%; - line-height: 0; - vertical-align: baseline; -} - -sub { - bottom: -0.25em; -} - -sup { - top: -0.5em; -} - -a { - color: #007bff; - text-decoration: none; - background-color: transparent; -} - -a:hover { - color: #0056b3; - text-decoration: underline; -} - -a:not([href]):not([class]) { - color: inherit; - text-decoration: none; -} - -a:not([href]):not([class]):hover { - color: inherit; - text-decoration: none; -} - -pre, -code, -kbd, -samp { - font-family: SFMono-Regular, Menlo, Monaco, Consolas, "Liberation Mono", "Courier New", monospace; - font-size: 1em; -} - -pre { - margin-top: 0; - margin-bottom: 1rem; - overflow: auto; - -ms-overflow-style: scrollbar; -} - -figure { - margin: 0 0 1rem; -} - -img { - vertical-align: middle; - border-style: none; -} - -svg { - overflow: hidden; - vertical-align: middle; -} - -table { - border-collapse: collapse; -} - -caption { - padding-top: 0.75rem; - padding-bottom: 0.75rem; - color: #6c757d; - text-align: left; - caption-side: bottom; -} - -th { - text-align: inherit; - text-align: -webkit-match-parent; -} - -label { - display: inline-block; - margin-bottom: 0.5rem; -} - -button { - border-radius: 0; -} - -button:focus { - outline: 1px dotted; - outline: 5px auto -webkit-focus-ring-color; -} - -input, -button, -select, -optgroup, -textarea { - margin: 0; - font-family: inherit; - font-size: inherit; - line-height: inherit; -} - -button, -input { - overflow: visible; -} - -button, -select { - text-transform: none; -} - -[role=button] { - cursor: pointer; -} - -select { - word-wrap: normal; -} - -button, -[type=button], -[type=reset], -[type=submit] { - -webkit-appearance: button; -} - -button:not(:disabled), -[type=button]:not(:disabled), -[type=reset]:not(:disabled), -[type=submit]:not(:disabled) { - cursor: pointer; -} - -button::-moz-focus-inner, -[type=button]::-moz-focus-inner, -[type=reset]::-moz-focus-inner, -[type=submit]::-moz-focus-inner { - padding: 0; - border-style: none; -} - -input[type=radio], -input[type=checkbox] { - box-sizing: border-box; - padding: 0; -} - -textarea { - overflow: auto; - resize: vertical; -} - -fieldset { - min-width: 0; - padding: 0; - margin: 0; - border: 0; -} - -legend { - display: block; - width: 100%; - max-width: 100%; - padding: 0; - margin-bottom: 0.5rem; - font-size: 1.5rem; - line-height: inherit; - color: inherit; - white-space: normal; -} - -progress { - vertical-align: baseline; -} - -[type=number]::-webkit-inner-spin-button, -[type=number]::-webkit-outer-spin-button { - height: auto; -} - -[type=search] { - outline-offset: -2px; - -webkit-appearance: none; -} - -[type=search]::-webkit-search-decoration { - -webkit-appearance: none; -} - -::-webkit-file-upload-button { - font: inherit; - -webkit-appearance: button; -} - -output { - display: inline-block; -} - -summary { - display: list-item; - cursor: pointer; -} - -template { - display: none; -} - -[hidden] { - display: none !important; -} - -.container, -.container-fluid, -.container-xl, -.container-lg, -.container-md, -.container-sm { - width: 100%; - padding-right: 10px; - padding-left: 10px; - margin-right: auto; - margin-left: auto; -} - -@media (min-width: 576px) { - .container-sm, - .container { - max-width: 540px; - } -} - -@media (min-width: 768px) { - .container-md, - .container-sm, - .container { - max-width: 720px; - } -} - -@media (min-width: 992px) { - .container-lg, - .container-md, - .container-sm, - .container { - max-width: 960px; - } -} - -@media (min-width: 1200px) { - .container-xl, - .container-lg, - .container-md, - .container-sm, - .container { - max-width: 1200px; - } -} - -.row { - display: flex; - flex-wrap: wrap; - margin-right: -10px; - margin-left: -10px; -} - -.no-gutters { - margin-right: 0; - margin-left: 0; -} - -.no-gutters > .col, -.no-gutters > [class*=col-] { - padding-right: 0; - padding-left: 0; -} - -.col-xl, -.col-xl-auto, -.col-xl-12, -.col-xl-11, -.col-xl-10, -.col-xl-9, -.col-xl-8, -.col-xl-7, -.col-xl-6, -.col-xl-5, -.col-xl-4, -.col-xl-3, -.col-xl-2, -.col-xl-1, -.col-lg, -.col-lg-auto, -.col-lg-12, -.col-lg-11, -.col-lg-10, -.col-lg-9, -.col-lg-8, -.col-lg-7, -.col-lg-6, -.col-lg-5, -.col-lg-4, -.col-lg-3, -.col-lg-2, -.col-lg-1, -.col-md, -.col-md-auto, -.col-md-12, -.col-md-11, -.col-md-10, -.col-md-9, -.col-md-8, -.col-md-7, -.col-md-6, -.col-md-5, -.col-md-4, -.col-md-3, -.col-md-2, -.col-md-1, -.col-sm, -.col-sm-auto, -.col-sm-12, -.col-sm-11, -.col-sm-10, -.col-sm-9, -.col-sm-8, -.col-sm-7, -.col-sm-6, -.col-sm-5, -.col-sm-4, -.col-sm-3, -.col-sm-2, -.col-sm-1, -.col, -.col-auto, -.col-12, -.col-11, -.col-10, -.col-9, -.col-8, -.col-7, -.col-6, -.col-5, -.col-4, -.col-3, -.col-2, -.col-1 { - position: relative; - width: 100%; - padding-right: 10px; - padding-left: 10px; -} - -.col { - flex-basis: 0; - flex-grow: 1; - max-width: 100%; -} - -.row-cols-1 > * { - flex: 0 0 100%; - max-width: 100%; -} - -.row-cols-2 > * { - flex: 0 0 50%; - max-width: 50%; -} - -.row-cols-3 > * { - flex: 0 0 33.3333333333%; - max-width: 33.3333333333%; -} - -.row-cols-4 > * { - flex: 0 0 25%; - max-width: 25%; -} - -.row-cols-5 > * { - flex: 0 0 20%; - max-width: 20%; -} - -.row-cols-6 > * { - flex: 0 0 16.6666666667%; - max-width: 16.6666666667%; -} - -.col-auto { - flex: 0 0 auto; - width: auto; - max-width: 100%; -} - -.col-1 { - flex: 0 0 8.3333333333%; - max-width: 8.3333333333%; -} - -.col-2 { - flex: 0 0 16.6666666667%; - max-width: 16.6666666667%; -} - -.col-3 { - flex: 0 0 25%; - max-width: 25%; -} - -.col-4 { - flex: 0 0 33.3333333333%; - max-width: 33.3333333333%; -} - -.col-5 { - flex: 0 0 41.6666666667%; - max-width: 41.6666666667%; -} - -.col-6 { - flex: 0 0 50%; - max-width: 50%; -} - -.col-7 { - flex: 0 0 58.3333333333%; - max-width: 58.3333333333%; -} - -.col-8 { - flex: 0 0 66.6666666667%; - max-width: 66.6666666667%; -} - -.col-9 { - flex: 0 0 75%; - max-width: 75%; -} - -.col-10 { - flex: 0 0 83.3333333333%; - max-width: 83.3333333333%; -} - -.col-11 { - flex: 0 0 91.6666666667%; - max-width: 91.6666666667%; -} - -.col-12 { - flex: 0 0 100%; - max-width: 100%; -} - -.order-first { - order: -1; -} - -.order-last { - order: 13; -} - -.order-0 { - order: 0; -} - -.order-1 { - order: 1; -} - -.order-2 { - order: 2; -} - -.order-3 { - order: 3; -} - -.order-4 { - order: 4; -} - -.order-5 { - order: 5; -} - -.order-6 { - order: 6; -} - -.order-7 { - order: 7; -} - -.order-8 { - order: 8; -} - -.order-9 { - order: 9; -} - -.order-10 { - order: 10; -} - -.order-11 { - order: 11; -} - -.order-12 { - order: 12; -} - -.offset-1 { - margin-left: 8.3333333333%; -} - -.offset-2 { - margin-left: 16.6666666667%; -} - -.offset-3 { - margin-left: 25%; -} - -.offset-4 { - margin-left: 33.3333333333%; -} - -.offset-5 { - margin-left: 41.6666666667%; -} - -.offset-6 { - margin-left: 50%; -} - -.offset-7 { - margin-left: 58.3333333333%; -} - -.offset-8 { - margin-left: 66.6666666667%; -} - -.offset-9 { - margin-left: 75%; -} - -.offset-10 { - margin-left: 83.3333333333%; -} - -.offset-11 { - margin-left: 91.6666666667%; -} - -@media (min-width: 576px) { - .col-sm { - flex-basis: 0; - flex-grow: 1; - max-width: 100%; - } - - .row-cols-sm-1 > * { - flex: 0 0 100%; - max-width: 100%; - } - - .row-cols-sm-2 > * { - flex: 0 0 50%; - max-width: 50%; - } - - .row-cols-sm-3 > * { - flex: 0 0 33.3333333333%; - max-width: 33.3333333333%; - } - - .row-cols-sm-4 > * { - flex: 0 0 25%; - max-width: 25%; - } - - .row-cols-sm-5 > * { - flex: 0 0 20%; - max-width: 20%; - } - - .row-cols-sm-6 > * { - flex: 0 0 16.6666666667%; - max-width: 16.6666666667%; - } - - .col-sm-auto { - flex: 0 0 auto; - width: auto; - max-width: 100%; - } - - .col-sm-1 { - flex: 0 0 8.3333333333%; - max-width: 8.3333333333%; - } - - .col-sm-2 { - flex: 0 0 16.6666666667%; - max-width: 16.6666666667%; - } - - .col-sm-3 { - flex: 0 0 25%; - max-width: 25%; - } - - .col-sm-4 { - flex: 0 0 33.3333333333%; - max-width: 33.3333333333%; - } - - .col-sm-5 { - flex: 0 0 41.6666666667%; - max-width: 41.6666666667%; - } - - .col-sm-6 { - flex: 0 0 50%; - max-width: 50%; - } - - .col-sm-7 { - flex: 0 0 58.3333333333%; - max-width: 58.3333333333%; - } - - .col-sm-8 { - flex: 0 0 66.6666666667%; - max-width: 66.6666666667%; - } - - .col-sm-9 { - flex: 0 0 75%; - max-width: 75%; - } - - .col-sm-10 { - flex: 0 0 83.3333333333%; - max-width: 83.3333333333%; - } - - .col-sm-11 { - flex: 0 0 91.6666666667%; - max-width: 91.6666666667%; - } - - .col-sm-12 { - flex: 0 0 100%; - max-width: 100%; - } - - .order-sm-first { - order: -1; - } - - .order-sm-last { - order: 13; - } - - .order-sm-0 { - order: 0; - } - - .order-sm-1 { - order: 1; - } - - .order-sm-2 { - order: 2; - } - - .order-sm-3 { - order: 3; - } - - .order-sm-4 { - order: 4; - } - - .order-sm-5 { - order: 5; - } - - .order-sm-6 { - order: 6; - } - - .order-sm-7 { - order: 7; - } - - .order-sm-8 { - order: 8; - } - - .order-sm-9 { - order: 9; - } - - .order-sm-10 { - order: 10; - } - - .order-sm-11 { - order: 11; - } - - .order-sm-12 { - order: 12; - } - - .offset-sm-0 { - margin-left: 0; - } - - .offset-sm-1 { - margin-left: 8.3333333333%; - } - - .offset-sm-2 { - margin-left: 16.6666666667%; - } - - .offset-sm-3 { - margin-left: 25%; - } - - .offset-sm-4 { - margin-left: 33.3333333333%; - } - - .offset-sm-5 { - margin-left: 41.6666666667%; - } - - .offset-sm-6 { - margin-left: 50%; - } - - .offset-sm-7 { - margin-left: 58.3333333333%; - } - - .offset-sm-8 { - margin-left: 66.6666666667%; - } - - .offset-sm-9 { - margin-left: 75%; - } - - .offset-sm-10 { - margin-left: 83.3333333333%; - } - - .offset-sm-11 { - margin-left: 91.6666666667%; - } -} - -@media (min-width: 768px) { - .col-md { - flex-basis: 0; - flex-grow: 1; - max-width: 100%; - } - - .row-cols-md-1 > * { - flex: 0 0 100%; - max-width: 100%; - } - - .row-cols-md-2 > * { - flex: 0 0 50%; - max-width: 50%; - } - - .row-cols-md-3 > * { - flex: 0 0 33.3333333333%; - max-width: 33.3333333333%; - } - - .row-cols-md-4 > * { - flex: 0 0 25%; - max-width: 25%; - } - - .row-cols-md-5 > * { - flex: 0 0 20%; - max-width: 20%; - } - - .row-cols-md-6 > * { - flex: 0 0 16.6666666667%; - max-width: 16.6666666667%; - } - - .col-md-auto { - flex: 0 0 auto; - width: auto; - max-width: 100%; - } - - .col-md-1 { - flex: 0 0 8.3333333333%; - max-width: 8.3333333333%; - } - - .col-md-2 { - flex: 0 0 16.6666666667%; - max-width: 16.6666666667%; - } - - .col-md-3 { - flex: 0 0 25%; - max-width: 25%; - } - - .col-md-4 { - flex: 0 0 33.3333333333%; - max-width: 33.3333333333%; - } - - .col-md-5 { - flex: 0 0 41.6666666667%; - max-width: 41.6666666667%; - } - - .col-md-6 { - flex: 0 0 50%; - max-width: 50%; - } - - .col-md-7 { - flex: 0 0 58.3333333333%; - max-width: 58.3333333333%; - } - - .col-md-8 { - flex: 0 0 66.6666666667%; - max-width: 66.6666666667%; - } - - .col-md-9 { - flex: 0 0 75%; - max-width: 75%; - } - - .col-md-10 { - flex: 0 0 83.3333333333%; - max-width: 83.3333333333%; - } - - .col-md-11 { - flex: 0 0 91.6666666667%; - max-width: 91.6666666667%; - } - - .col-md-12 { - flex: 0 0 100%; - max-width: 100%; - } - - .order-md-first { - order: -1; - } - - .order-md-last { - order: 13; - } - - .order-md-0 { - order: 0; - } - - .order-md-1 { - order: 1; - } - - .order-md-2 { - order: 2; - } - - .order-md-3 { - order: 3; - } - - .order-md-4 { - order: 4; - } - - .order-md-5 { - order: 5; - } - - .order-md-6 { - order: 6; - } - - .order-md-7 { - order: 7; - } - - .order-md-8 { - order: 8; - } - - .order-md-9 { - order: 9; - } - - .order-md-10 { - order: 10; - } - - .order-md-11 { - order: 11; - } - - .order-md-12 { - order: 12; - } - - .offset-md-0 { - margin-left: 0; - } - - .offset-md-1 { - margin-left: 8.3333333333%; - } - - .offset-md-2 { - margin-left: 16.6666666667%; - } - - .offset-md-3 { - margin-left: 25%; - } - - .offset-md-4 { - margin-left: 33.3333333333%; - } - - .offset-md-5 { - margin-left: 41.6666666667%; - } - - .offset-md-6 { - margin-left: 50%; - } - - .offset-md-7 { - margin-left: 58.3333333333%; - } - - .offset-md-8 { - margin-left: 66.6666666667%; - } - - .offset-md-9 { - margin-left: 75%; - } - - .offset-md-10 { - margin-left: 83.3333333333%; - } - - .offset-md-11 { - margin-left: 91.6666666667%; - } -} - -@media (min-width: 992px) { - .col-lg { - flex-basis: 0; - flex-grow: 1; - max-width: 100%; - } - - .row-cols-lg-1 > * { - flex: 0 0 100%; - max-width: 100%; - } - - .row-cols-lg-2 > * { - flex: 0 0 50%; - max-width: 50%; - } - - .row-cols-lg-3 > * { - flex: 0 0 33.3333333333%; - max-width: 33.3333333333%; - } - - .row-cols-lg-4 > * { - flex: 0 0 25%; - max-width: 25%; - } - - .row-cols-lg-5 > * { - flex: 0 0 20%; - max-width: 20%; - } - - .row-cols-lg-6 > * { - flex: 0 0 16.6666666667%; - max-width: 16.6666666667%; - } - - .col-lg-auto { - flex: 0 0 auto; - width: auto; - max-width: 100%; - } - - .col-lg-1 { - flex: 0 0 8.3333333333%; - max-width: 8.3333333333%; - } - - .col-lg-2 { - flex: 0 0 16.6666666667%; - max-width: 16.6666666667%; - } - - .col-lg-3 { - flex: 0 0 25%; - max-width: 25%; - } - - .col-lg-4 { - flex: 0 0 33.3333333333%; - max-width: 33.3333333333%; - } - - .col-lg-5 { - flex: 0 0 41.6666666667%; - max-width: 41.6666666667%; - } - - .col-lg-6 { - flex: 0 0 50%; - max-width: 50%; - } - - .col-lg-7 { - flex: 0 0 58.3333333333%; - max-width: 58.3333333333%; - } - - .col-lg-8 { - flex: 0 0 66.6666666667%; - max-width: 66.6666666667%; - } - - .col-lg-9 { - flex: 0 0 75%; - max-width: 75%; - } - - .col-lg-10 { - flex: 0 0 83.3333333333%; - max-width: 83.3333333333%; - } - - .col-lg-11 { - flex: 0 0 91.6666666667%; - max-width: 91.6666666667%; - } - - .col-lg-12 { - flex: 0 0 100%; - max-width: 100%; - } - - .order-lg-first { - order: -1; - } - - .order-lg-last { - order: 13; - } - - .order-lg-0 { - order: 0; - } - - .order-lg-1 { - order: 1; - } - - .order-lg-2 { - order: 2; - } - - .order-lg-3 { - order: 3; - } - - .order-lg-4 { - order: 4; - } - - .order-lg-5 { - order: 5; - } - - .order-lg-6 { - order: 6; - } - - .order-lg-7 { - order: 7; - } - - .order-lg-8 { - order: 8; - } - - .order-lg-9 { - order: 9; - } - - .order-lg-10 { - order: 10; - } - - .order-lg-11 { - order: 11; - } - - .order-lg-12 { - order: 12; - } - - .offset-lg-0 { - margin-left: 0; - } - - .offset-lg-1 { - margin-left: 8.3333333333%; - } - - .offset-lg-2 { - margin-left: 16.6666666667%; - } - - .offset-lg-3 { - margin-left: 25%; - } - - .offset-lg-4 { - margin-left: 33.3333333333%; - } - - .offset-lg-5 { - margin-left: 41.6666666667%; - } - - .offset-lg-6 { - margin-left: 50%; - } - - .offset-lg-7 { - margin-left: 58.3333333333%; - } - - .offset-lg-8 { - margin-left: 66.6666666667%; - } - - .offset-lg-9 { - margin-left: 75%; - } - - .offset-lg-10 { - margin-left: 83.3333333333%; - } - - .offset-lg-11 { - margin-left: 91.6666666667%; - } -} - -@media (min-width: 1200px) { - .col-xl { - flex-basis: 0; - flex-grow: 1; - max-width: 100%; - } - - .row-cols-xl-1 > * { - flex: 0 0 100%; - max-width: 100%; - } - - .row-cols-xl-2 > * { - flex: 0 0 50%; - max-width: 50%; - } - - .row-cols-xl-3 > * { - flex: 0 0 33.3333333333%; - max-width: 33.3333333333%; - } - - .row-cols-xl-4 > * { - flex: 0 0 25%; - max-width: 25%; - } - - .row-cols-xl-5 > * { - flex: 0 0 20%; - max-width: 20%; - } - - .row-cols-xl-6 > * { - flex: 0 0 16.6666666667%; - max-width: 16.6666666667%; - } - - .col-xl-auto { - flex: 0 0 auto; - width: auto; - max-width: 100%; - } - - .col-xl-1 { - flex: 0 0 8.3333333333%; - max-width: 8.3333333333%; - } - - .col-xl-2 { - flex: 0 0 16.6666666667%; - max-width: 16.6666666667%; - } - - .col-xl-3 { - flex: 0 0 25%; - max-width: 25%; - } - - .col-xl-4 { - flex: 0 0 33.3333333333%; - max-width: 33.3333333333%; - } - - .col-xl-5 { - flex: 0 0 41.6666666667%; - max-width: 41.6666666667%; - } - - .col-xl-6 { - flex: 0 0 50%; - max-width: 50%; - } - - .col-xl-7 { - flex: 0 0 58.3333333333%; - max-width: 58.3333333333%; - } - - .col-xl-8 { - flex: 0 0 66.6666666667%; - max-width: 66.6666666667%; - } - - .col-xl-9 { - flex: 0 0 75%; - max-width: 75%; - } - - .col-xl-10 { - flex: 0 0 83.3333333333%; - max-width: 83.3333333333%; - } - - .col-xl-11 { - flex: 0 0 91.6666666667%; - max-width: 91.6666666667%; - } - - .col-xl-12 { - flex: 0 0 100%; - max-width: 100%; - } - - .order-xl-first { - order: -1; - } - - .order-xl-last { - order: 13; - } - - .order-xl-0 { - order: 0; - } - - .order-xl-1 { - order: 1; - } - - .order-xl-2 { - order: 2; - } - - .order-xl-3 { - order: 3; - } - - .order-xl-4 { - order: 4; - } - - .order-xl-5 { - order: 5; - } - - .order-xl-6 { - order: 6; - } - - .order-xl-7 { - order: 7; - } - - .order-xl-8 { - order: 8; - } - - .order-xl-9 { - order: 9; - } - - .order-xl-10 { - order: 10; - } - - .order-xl-11 { - order: 11; - } - - .order-xl-12 { - order: 12; - } - - .offset-xl-0 { - margin-left: 0; - } - - .offset-xl-1 { - margin-left: 8.3333333333%; - } - - .offset-xl-2 { - margin-left: 16.6666666667%; - } - - .offset-xl-3 { - margin-left: 25%; - } - - .offset-xl-4 { - margin-left: 33.3333333333%; - } - - .offset-xl-5 { - margin-left: 41.6666666667%; - } - - .offset-xl-6 { - margin-left: 50%; - } - - .offset-xl-7 { - margin-left: 58.3333333333%; - } - - .offset-xl-8 { - margin-left: 66.6666666667%; - } - - .offset-xl-9 { - margin-left: 75%; - } - - .offset-xl-10 { - margin-left: 83.3333333333%; - } - - .offset-xl-11 { - margin-left: 91.6666666667%; - } -} - -.btn { - display: inline-block; - font-weight: 400; - color: #212529; - text-align: center; - vertical-align: middle; - -webkit-user-select: none; - -moz-user-select: none; - -ms-user-select: none; - user-select: none; - background-color: transparent; - border: 1px solid transparent; - padding: 0.375rem 0.75rem; - font-size: 1rem; - line-height: 1.5; - border-radius: 0.25rem; - transition: color 0.15s ease-in-out, background-color 0.15s ease-in-out, border-color 0.15s ease-in-out, box-shadow 0.15s ease-in-out; -} - -@media (prefers-reduced-motion: reduce) { - .btn { - transition: none; - } -} - -.btn:hover { - color: #212529; - text-decoration: none; -} - -.btn:focus, -.btn.focus { - outline: 0; - box-shadow: 0 0 0 0.2rem rgba(0, 123, 255, 0.25); -} - -.btn.disabled, -.btn:disabled { - opacity: 0.65; -} - -.btn:not(:disabled):not(.disabled) { - cursor: pointer; -} - -a.btn.disabled, -fieldset:disabled a.btn { - pointer-events: none; -} - -.btn-primary { - color: #fff; - background-color: #007bff; - border-color: #007bff; -} - -.btn-primary:hover { - color: #fff; - background-color: #0069d9; - border-color: #0062cc; -} - -.btn-primary:focus, -.btn-primary.focus { - color: #fff; - background-color: #0069d9; - border-color: #0062cc; - box-shadow: 0 0 0 0.2rem rgba(38, 143, 255, 0.5); -} - -.btn-primary.disabled, -.btn-primary:disabled { - color: #fff; - background-color: #007bff; - border-color: #007bff; -} - -.btn-primary:not(:disabled):not(.disabled):active, -.btn-primary:not(:disabled):not(.disabled).active, -.show > .btn-primary.dropdown-toggle { - color: #fff; - background-color: #0062cc; - border-color: #005cbf; -} - -.btn-primary:not(:disabled):not(.disabled):active:focus, -.btn-primary:not(:disabled):not(.disabled).active:focus, -.show > .btn-primary.dropdown-toggle:focus { - box-shadow: 0 0 0 0.2rem rgba(38, 143, 255, 0.5); -} - -.btn-secondary { - color: #fff; - background-color: #6c757d; - border-color: #6c757d; -} - -.btn-secondary:hover { - color: #fff; - background-color: #5a6268; - border-color: #545b62; -} - -.btn-secondary:focus, -.btn-secondary.focus { - color: #fff; - background-color: #5a6268; - border-color: #545b62; - box-shadow: 0 0 0 0.2rem rgba(130, 138, 145, 0.5); -} - -.btn-secondary.disabled, -.btn-secondary:disabled { - color: #fff; - background-color: #6c757d; - border-color: #6c757d; -} - -.btn-secondary:not(:disabled):not(.disabled):active, -.btn-secondary:not(:disabled):not(.disabled).active, -.show > .btn-secondary.dropdown-toggle { - color: #fff; - background-color: #545b62; - border-color: #4e555b; -} - -.btn-secondary:not(:disabled):not(.disabled):active:focus, -.btn-secondary:not(:disabled):not(.disabled).active:focus, -.show > .btn-secondary.dropdown-toggle:focus { - box-shadow: 0 0 0 0.2rem rgba(130, 138, 145, 0.5); -} - -.btn-success { - color: #fff; - background-color: #28a745; - border-color: #28a745; -} - -.btn-success:hover { - color: #fff; - background-color: #218838; - border-color: #1e7e34; -} - -.btn-success:focus, -.btn-success.focus { - color: #fff; - background-color: #218838; - border-color: #1e7e34; - box-shadow: 0 0 0 0.2rem rgba(72, 180, 97, 0.5); -} - -.btn-success.disabled, -.btn-success:disabled { - color: #fff; - background-color: #28a745; - border-color: #28a745; -} - -.btn-success:not(:disabled):not(.disabled):active, -.btn-success:not(:disabled):not(.disabled).active, -.show > .btn-success.dropdown-toggle { - color: #fff; - background-color: #1e7e34; - border-color: #1c7430; -} - -.btn-success:not(:disabled):not(.disabled):active:focus, -.btn-success:not(:disabled):not(.disabled).active:focus, -.show > .btn-success.dropdown-toggle:focus { - box-shadow: 0 0 0 0.2rem rgba(72, 180, 97, 0.5); -} - -.btn-info { - color: #fff; - background-color: #17a2b8; - border-color: #17a2b8; -} - -.btn-info:hover { - color: #fff; - background-color: #138496; - border-color: #117a8b; -} - -.btn-info:focus, -.btn-info.focus { - color: #fff; - background-color: #138496; - border-color: #117a8b; - box-shadow: 0 0 0 0.2rem rgba(58, 176, 195, 0.5); -} - -.btn-info.disabled, -.btn-info:disabled { - color: #fff; - background-color: #17a2b8; - border-color: #17a2b8; -} - -.btn-info:not(:disabled):not(.disabled):active, -.btn-info:not(:disabled):not(.disabled).active, -.show > .btn-info.dropdown-toggle { - color: #fff; - background-color: #117a8b; - border-color: #10707f; -} - -.btn-info:not(:disabled):not(.disabled):active:focus, -.btn-info:not(:disabled):not(.disabled).active:focus, -.show > .btn-info.dropdown-toggle:focus { - box-shadow: 0 0 0 0.2rem rgba(58, 176, 195, 0.5); -} - -.btn-warning { - color: #212529; - background-color: #ffc107; - border-color: #ffc107; -} - -.btn-warning:hover { - color: #212529; - background-color: #e0a800; - border-color: #d39e00; -} - -.btn-warning:focus, -.btn-warning.focus { - color: #212529; - background-color: #e0a800; - border-color: #d39e00; - box-shadow: 0 0 0 0.2rem rgba(222, 170, 12, 0.5); -} - -.btn-warning.disabled, -.btn-warning:disabled { - color: #212529; - background-color: #ffc107; - border-color: #ffc107; -} - -.btn-warning:not(:disabled):not(.disabled):active, -.btn-warning:not(:disabled):not(.disabled).active, -.show > .btn-warning.dropdown-toggle { - color: #212529; - background-color: #d39e00; - border-color: #c69500; -} - -.btn-warning:not(:disabled):not(.disabled):active:focus, -.btn-warning:not(:disabled):not(.disabled).active:focus, -.show > .btn-warning.dropdown-toggle:focus { - box-shadow: 0 0 0 0.2rem rgba(222, 170, 12, 0.5); -} - -.btn-danger { - color: #fff; - background-color: #dc3545; - border-color: #dc3545; -} - -.btn-danger:hover { - color: #fff; - background-color: #c82333; - border-color: #bd2130; -} - -.btn-danger:focus, -.btn-danger.focus { - color: #fff; - background-color: #c82333; - border-color: #bd2130; - box-shadow: 0 0 0 0.2rem rgba(225, 83, 97, 0.5); -} - -.btn-danger.disabled, -.btn-danger:disabled { - color: #fff; - background-color: #dc3545; - border-color: #dc3545; -} - -.btn-danger:not(:disabled):not(.disabled):active, -.btn-danger:not(:disabled):not(.disabled).active, -.show > .btn-danger.dropdown-toggle { - color: #fff; - background-color: #bd2130; - border-color: #b21f2d; -} - -.btn-danger:not(:disabled):not(.disabled):active:focus, -.btn-danger:not(:disabled):not(.disabled).active:focus, -.show > .btn-danger.dropdown-toggle:focus { - box-shadow: 0 0 0 0.2rem rgba(225, 83, 97, 0.5); -} - -.btn-light { - color: #212529; - background-color: #f8f9fa; - border-color: #f8f9fa; -} - -.btn-light:hover { - color: #212529; - background-color: #e2e6ea; - border-color: #dae0e5; -} - -.btn-light:focus, -.btn-light.focus { - color: #212529; - background-color: #e2e6ea; - border-color: #dae0e5; - box-shadow: 0 0 0 0.2rem rgba(216, 217, 219, 0.5); -} - -.btn-light.disabled, -.btn-light:disabled { - color: #212529; - background-color: #f8f9fa; - border-color: #f8f9fa; -} - -.btn-light:not(:disabled):not(.disabled):active, -.btn-light:not(:disabled):not(.disabled).active, -.show > .btn-light.dropdown-toggle { - color: #212529; - background-color: #dae0e5; - border-color: #d3d9df; -} - -.btn-light:not(:disabled):not(.disabled):active:focus, -.btn-light:not(:disabled):not(.disabled).active:focus, -.show > .btn-light.dropdown-toggle:focus { - box-shadow: 0 0 0 0.2rem rgba(216, 217, 219, 0.5); -} - -.btn-dark { - color: #fff; - background-color: #343a40; - border-color: #343a40; -} - -.btn-dark:hover { - color: #fff; - background-color: #23272b; - border-color: #1d2124; -} - -.btn-dark:focus, -.btn-dark.focus { - color: #fff; - background-color: #23272b; - border-color: #1d2124; - box-shadow: 0 0 0 0.2rem rgba(82, 88, 93, 0.5); -} - -.btn-dark.disabled, -.btn-dark:disabled { - color: #fff; - background-color: #343a40; - border-color: #343a40; -} - -.btn-dark:not(:disabled):not(.disabled):active, -.btn-dark:not(:disabled):not(.disabled).active, -.show > .btn-dark.dropdown-toggle { - color: #fff; - background-color: #1d2124; - border-color: #171a1d; -} - -.btn-dark:not(:disabled):not(.disabled):active:focus, -.btn-dark:not(:disabled):not(.disabled).active:focus, -.show > .btn-dark.dropdown-toggle:focus { - box-shadow: 0 0 0 0.2rem rgba(82, 88, 93, 0.5); -} - -.btn-outline-primary { - color: #007bff; - border-color: #007bff; -} - -.btn-outline-primary:hover { - color: #fff; - background-color: #007bff; - border-color: #007bff; -} - -.btn-outline-primary:focus, -.btn-outline-primary.focus { - box-shadow: 0 0 0 0.2rem rgba(0, 123, 255, 0.5); -} - -.btn-outline-primary.disabled, -.btn-outline-primary:disabled { - color: #007bff; - background-color: transparent; -} - -.btn-outline-primary:not(:disabled):not(.disabled):active, -.btn-outline-primary:not(:disabled):not(.disabled).active, -.show > .btn-outline-primary.dropdown-toggle { - color: #fff; - background-color: #007bff; - border-color: #007bff; -} - -.btn-outline-primary:not(:disabled):not(.disabled):active:focus, -.btn-outline-primary:not(:disabled):not(.disabled).active:focus, -.show > .btn-outline-primary.dropdown-toggle:focus { - box-shadow: 0 0 0 0.2rem rgba(0, 123, 255, 0.5); -} - -.btn-outline-secondary { - color: #6c757d; - border-color: #6c757d; -} - -.btn-outline-secondary:hover { - color: #fff; - background-color: #6c757d; - border-color: #6c757d; -} - -.btn-outline-secondary:focus, -.btn-outline-secondary.focus { - box-shadow: 0 0 0 0.2rem rgba(108, 117, 125, 0.5); -} - -.btn-outline-secondary.disabled, -.btn-outline-secondary:disabled { - color: #6c757d; - background-color: transparent; -} - -.btn-outline-secondary:not(:disabled):not(.disabled):active, -.btn-outline-secondary:not(:disabled):not(.disabled).active, -.show > .btn-outline-secondary.dropdown-toggle { - color: #fff; - background-color: #6c757d; - border-color: #6c757d; -} - -.btn-outline-secondary:not(:disabled):not(.disabled):active:focus, -.btn-outline-secondary:not(:disabled):not(.disabled).active:focus, -.show > .btn-outline-secondary.dropdown-toggle:focus { - box-shadow: 0 0 0 0.2rem rgba(108, 117, 125, 0.5); -} - -.btn-outline-success { - color: #28a745; - border-color: #28a745; -} - -.btn-outline-success:hover { - color: #fff; - background-color: #28a745; - border-color: #28a745; -} - -.btn-outline-success:focus, -.btn-outline-success.focus { - box-shadow: 0 0 0 0.2rem rgba(40, 167, 69, 0.5); -} - -.btn-outline-success.disabled, -.btn-outline-success:disabled { - color: #28a745; - background-color: transparent; -} - -.btn-outline-success:not(:disabled):not(.disabled):active, -.btn-outline-success:not(:disabled):not(.disabled).active, -.show > .btn-outline-success.dropdown-toggle { - color: #fff; - background-color: #28a745; - border-color: #28a745; -} - -.btn-outline-success:not(:disabled):not(.disabled):active:focus, -.btn-outline-success:not(:disabled):not(.disabled).active:focus, -.show > .btn-outline-success.dropdown-toggle:focus { - box-shadow: 0 0 0 0.2rem rgba(40, 167, 69, 0.5); -} - -.btn-outline-info { - color: #17a2b8; - border-color: #17a2b8; -} - -.btn-outline-info:hover { - color: #fff; - background-color: #17a2b8; - border-color: #17a2b8; -} - -.btn-outline-info:focus, -.btn-outline-info.focus { - box-shadow: 0 0 0 0.2rem rgba(23, 162, 184, 0.5); -} - -.btn-outline-info.disabled, -.btn-outline-info:disabled { - color: #17a2b8; - background-color: transparent; -} - -.btn-outline-info:not(:disabled):not(.disabled):active, -.btn-outline-info:not(:disabled):not(.disabled).active, -.show > .btn-outline-info.dropdown-toggle { - color: #fff; - background-color: #17a2b8; - border-color: #17a2b8; -} - -.btn-outline-info:not(:disabled):not(.disabled):active:focus, -.btn-outline-info:not(:disabled):not(.disabled).active:focus, -.show > .btn-outline-info.dropdown-toggle:focus { - box-shadow: 0 0 0 0.2rem rgba(23, 162, 184, 0.5); -} - -.btn-outline-warning { - color: #ffc107; - border-color: #ffc107; -} - -.btn-outline-warning:hover { - color: #212529; - background-color: #ffc107; - border-color: #ffc107; -} - -.btn-outline-warning:focus, -.btn-outline-warning.focus { - box-shadow: 0 0 0 0.2rem rgba(255, 193, 7, 0.5); -} - -.btn-outline-warning.disabled, -.btn-outline-warning:disabled { - color: #ffc107; - background-color: transparent; -} - -.btn-outline-warning:not(:disabled):not(.disabled):active, -.btn-outline-warning:not(:disabled):not(.disabled).active, -.show > .btn-outline-warning.dropdown-toggle { - color: #212529; - background-color: #ffc107; - border-color: #ffc107; -} - -.btn-outline-warning:not(:disabled):not(.disabled):active:focus, -.btn-outline-warning:not(:disabled):not(.disabled).active:focus, -.show > .btn-outline-warning.dropdown-toggle:focus { - box-shadow: 0 0 0 0.2rem rgba(255, 193, 7, 0.5); -} - -.btn-outline-danger { - color: #dc3545; - border-color: #dc3545; -} - -.btn-outline-danger:hover { - color: #fff; - background-color: #dc3545; - border-color: #dc3545; -} - -.btn-outline-danger:focus, -.btn-outline-danger.focus { - box-shadow: 0 0 0 0.2rem rgba(220, 53, 69, 0.5); -} - -.btn-outline-danger.disabled, -.btn-outline-danger:disabled { - color: #dc3545; - background-color: transparent; -} - -.btn-outline-danger:not(:disabled):not(.disabled):active, -.btn-outline-danger:not(:disabled):not(.disabled).active, -.show > .btn-outline-danger.dropdown-toggle { - color: #fff; - background-color: #dc3545; - border-color: #dc3545; -} - -.btn-outline-danger:not(:disabled):not(.disabled):active:focus, -.btn-outline-danger:not(:disabled):not(.disabled).active:focus, -.show > .btn-outline-danger.dropdown-toggle:focus { - box-shadow: 0 0 0 0.2rem rgba(220, 53, 69, 0.5); -} - -.btn-outline-light { - color: #f8f9fa; - border-color: #f8f9fa; -} - -.btn-outline-light:hover { - color: #212529; - background-color: #f8f9fa; - border-color: #f8f9fa; -} - -.btn-outline-light:focus, -.btn-outline-light.focus { - box-shadow: 0 0 0 0.2rem rgba(248, 249, 250, 0.5); -} - -.btn-outline-light.disabled, -.btn-outline-light:disabled { - color: #f8f9fa; - background-color: transparent; -} - -.btn-outline-light:not(:disabled):not(.disabled):active, -.btn-outline-light:not(:disabled):not(.disabled).active, -.show > .btn-outline-light.dropdown-toggle { - color: #212529; - background-color: #f8f9fa; - border-color: #f8f9fa; -} - -.btn-outline-light:not(:disabled):not(.disabled):active:focus, -.btn-outline-light:not(:disabled):not(.disabled).active:focus, -.show > .btn-outline-light.dropdown-toggle:focus { - box-shadow: 0 0 0 0.2rem rgba(248, 249, 250, 0.5); -} - -.btn-outline-dark { - color: #343a40; - border-color: #343a40; -} - -.btn-outline-dark:hover { - color: #fff; - background-color: #343a40; - border-color: #343a40; -} - -.btn-outline-dark:focus, -.btn-outline-dark.focus { - box-shadow: 0 0 0 0.2rem rgba(52, 58, 64, 0.5); -} - -.btn-outline-dark.disabled, -.btn-outline-dark:disabled { - color: #343a40; - background-color: transparent; -} - -.btn-outline-dark:not(:disabled):not(.disabled):active, -.btn-outline-dark:not(:disabled):not(.disabled).active, -.show > .btn-outline-dark.dropdown-toggle { - color: #fff; - background-color: #343a40; - border-color: #343a40; -} - -.btn-outline-dark:not(:disabled):not(.disabled):active:focus, -.btn-outline-dark:not(:disabled):not(.disabled).active:focus, -.show > .btn-outline-dark.dropdown-toggle:focus { - box-shadow: 0 0 0 0.2rem rgba(52, 58, 64, 0.5); -} - -.btn-link { - font-weight: 400; - color: #007bff; - text-decoration: none; -} - -.btn-link:hover { - color: #0056b3; - text-decoration: underline; -} - -.btn-link:focus, -.btn-link.focus { - text-decoration: underline; -} - -.btn-link:disabled, -.btn-link.disabled { - color: #6c757d; - pointer-events: none; -} - -.btn-lg { - padding: 0.5rem 1rem; - font-size: 1.25rem; - line-height: 1.5; - border-radius: 0.3rem; -} - -.btn-sm { - padding: 0.25rem 0.5rem; - font-size: 0.875rem; - line-height: 1.5; - border-radius: 0.2rem; -} - -.btn-block { - display: block; - width: 100%; -} - -.btn-block + .btn-block { - margin-top: 0.5rem; -} - -input[type=submit].btn-block, -input[type=reset].btn-block, -input[type=button].btn-block { - width: 100%; -} - -.fade { - transition: opacity 0.15s linear; -} - -@media (prefers-reduced-motion: reduce) { - .fade { - transition: none; - } -} - -.fade:not(.show) { - opacity: 0; -} - -.collapse:not(.show) { - display: none; -} - -.collapsing { - position: relative; - height: 0; - overflow: hidden; - transition: height 0.35s ease; -} - -@media (prefers-reduced-motion: reduce) { - .collapsing { - transition: none; - } -} - -.dropup, -.dropright, -.dropdown, -.dropleft { - position: relative; -} - -.dropdown-toggle { - white-space: nowrap; -} - -.dropdown-toggle::after { - display: inline-block; - margin-left: 0.255em; - vertical-align: 0.255em; - content: ""; - border-top: 0.3em solid; - border-right: 0.3em solid transparent; - border-bottom: 0; - border-left: 0.3em solid transparent; -} - -.dropdown-toggle:empty::after { - margin-left: 0; -} - -.dropdown-menu { - position: absolute; - top: 100%; - left: 0; - z-index: 1000; - display: none; - float: left; - min-width: 10rem; - padding: 24px 0; - margin: 0 0 0; - font-size: 1rem; - color: #212529; - text-align: left; - list-style: none; - background-color: #fff; - background-clip: padding-box; - border: 0 solid rgba(0, 0, 0, 0.15); - border-radius: 0; -} - -.dropdown-menu-left { - right: auto; - left: 0; -} - -.dropdown-menu-right { - right: 0; - left: auto; -} - -@media (min-width: 576px) { - .dropdown-menu-sm-left { - right: auto; - left: 0; - } - - .dropdown-menu-sm-right { - right: 0; - left: auto; - } -} - -@media (min-width: 768px) { - .dropdown-menu-md-left { - right: auto; - left: 0; - } - - .dropdown-menu-md-right { - right: 0; - left: auto; - } -} - -@media (min-width: 992px) { - .dropdown-menu-lg-left { - right: auto; - left: 0; - } - - .dropdown-menu-lg-right { - right: 0; - left: auto; - } -} - -@media (min-width: 1200px) { - .dropdown-menu-xl-left { - right: auto; - left: 0; - } - - .dropdown-menu-xl-right { - right: 0; - left: auto; - } -} - -.dropup .dropdown-menu { - top: auto; - bottom: 100%; - margin-top: 0; - margin-bottom: 0; -} - -.dropup .dropdown-toggle::after { - display: inline-block; - margin-left: 0.255em; - vertical-align: 0.255em; - content: ""; - border-top: 0; - border-right: 0.3em solid transparent; - border-bottom: 0.3em solid; - border-left: 0.3em solid transparent; -} - -.dropup .dropdown-toggle:empty::after { - margin-left: 0; -} - -.dropright .dropdown-menu { - top: 0; - right: auto; - left: 100%; - margin-top: 0; - margin-left: 0; -} - -.dropright .dropdown-toggle::after { - display: inline-block; - margin-left: 0.255em; - vertical-align: 0.255em; - content: ""; - border-top: 0.3em solid transparent; - border-right: 0; - border-bottom: 0.3em solid transparent; - border-left: 0.3em solid; -} - -.dropright .dropdown-toggle:empty::after { - margin-left: 0; -} - -.dropright .dropdown-toggle::after { - vertical-align: 0; -} - -.dropleft .dropdown-menu { - top: 0; - right: 100%; - left: auto; - margin-top: 0; - margin-right: 0; -} - -.dropleft .dropdown-toggle::after { - display: inline-block; - margin-left: 0.255em; - vertical-align: 0.255em; - content: ""; -} - -.dropleft .dropdown-toggle::after { - display: none; -} - -.dropleft .dropdown-toggle::before { - display: inline-block; - margin-right: 0.255em; - vertical-align: 0.255em; - content: ""; - border-top: 0.3em solid transparent; - border-right: 0.3em solid; - border-bottom: 0.3em solid transparent; -} - -.dropleft .dropdown-toggle:empty::after { - margin-left: 0; -} - -.dropleft .dropdown-toggle::before { - vertical-align: 0; -} - -.dropdown-menu[x-placement^=top], -.dropdown-menu[x-placement^=right], -.dropdown-menu[x-placement^=bottom], -.dropdown-menu[x-placement^=left] { - right: auto; - bottom: auto; -} - -.dropdown-divider { - height: 0; - margin: 0.5rem 0; - overflow: hidden; - border-top: 1px solid #e9ecef; -} - -.dropdown-item { - display: block; - width: 100%; - padding: 0.25rem 1.5rem; - clear: both; - font-weight: 400; - color: #797F90; - text-align: inherit; - white-space: nowrap; - background-color: transparent; - border: 0; -} - -.dropdown-item:hover, -.dropdown-item:focus { - color: #FF6F00; - text-decoration: none; - background-color: transparent; -} - -.dropdown-item.active, -.dropdown-item:active { - color: #fff; - text-decoration: none; - background-color: #007bff; -} - -.dropdown-item.disabled, -.dropdown-item:disabled { - color: #6c757d; - pointer-events: none; - background-color: transparent; -} - -.dropdown-menu.show { - display: block; -} - -.dropdown-header { - display: block; - padding: 24px 1.5rem; - margin-bottom: 0; - font-size: 0.875rem; - color: #6c757d; - white-space: nowrap; -} - -.dropdown-item-text { - display: block; - padding: 0.25rem 1.5rem; - color: #797F90; -} - -.navbar { - position: relative; - display: flex; - flex-wrap: wrap; - align-items: center; - justify-content: space-between; - padding: 0 1rem; -} - -.navbar .container, -.navbar .container-fluid, -.navbar .container-sm, -.navbar .container-md, -.navbar .container-lg, -.navbar .container-xl { - display: flex; - flex-wrap: wrap; - align-items: center; - justify-content: space-between; -} - -.navbar-brand { - display: inline-block; - padding-top: -0.1875rem; - padding-bottom: -0.1875rem; - margin-right: 1rem; - font-size: 1.25rem; - line-height: inherit; - white-space: nowrap; -} - -.navbar-brand:hover, -.navbar-brand:focus { - text-decoration: none; -} - -.navbar-nav { - display: flex; - flex-direction: column; - padding-left: 0; - margin-bottom: 0; - list-style: none; -} - -.navbar-nav .nav-link { - padding-right: 0; - padding-left: 0; -} - -.navbar-nav .dropdown-menu { - position: static; - float: none; -} - -.navbar-text { - display: inline-block; - padding-top: 0; - padding-bottom: 0; -} - -.navbar-collapse { - flex-basis: 100%; - flex-grow: 1; - align-items: center; -} - -.navbar-toggler { - padding: 0.25rem 0.75rem; - font-size: 1.25rem; - line-height: 1; - background-color: transparent; - border: 1px solid transparent; - border-radius: 0.25rem; -} - -.navbar-toggler:hover, -.navbar-toggler:focus { - text-decoration: none; -} - -.navbar-toggler-icon { - display: inline-block; - width: 1.5em; - height: 1.5em; - vertical-align: middle; - content: ""; - background: no-repeat center center; - background-size: 100% 100%; -} - -@media (max-width: 575.98px) { - .navbar-expand-sm > .container, - .navbar-expand-sm > .container-fluid, - .navbar-expand-sm > .container-sm, - .navbar-expand-sm > .container-md, - .navbar-expand-sm > .container-lg, - .navbar-expand-sm > .container-xl { - padding-right: 0; - padding-left: 0; - } -} - -@media (min-width: 576px) { - .navbar-expand-sm { - flex-flow: row nowrap; - justify-content: flex-start; - } - - .navbar-expand-sm .navbar-nav { - flex-direction: row; - } - - .navbar-expand-sm .navbar-nav .dropdown-menu { - position: absolute; - } - - .navbar-expand-sm .navbar-nav .nav-link { - padding-right: 0; - padding-left: 0; - } - - .navbar-expand-sm > .container, - .navbar-expand-sm > .container-fluid, - .navbar-expand-sm > .container-sm, - .navbar-expand-sm > .container-md, - .navbar-expand-sm > .container-lg, - .navbar-expand-sm > .container-xl { - flex-wrap: nowrap; - } - - .navbar-expand-sm .navbar-collapse { - display: flex !important; - flex-basis: auto; - } - - .navbar-expand-sm .navbar-toggler { - display: none; - } -} - -@media (max-width: 767.98px) { - .navbar-expand-md > .container, - .navbar-expand-md > .container-fluid, - .navbar-expand-md > .container-sm, - .navbar-expand-md > .container-md, - .navbar-expand-md > .container-lg, - .navbar-expand-md > .container-xl { - padding-right: 0; - padding-left: 0; - } -} - -@media (min-width: 768px) { - .navbar-expand-md { - flex-flow: row nowrap; - justify-content: flex-start; - } - - .navbar-expand-md .navbar-nav { - flex-direction: row; - } - - .navbar-expand-md .navbar-nav .dropdown-menu { - position: absolute; - } - - .navbar-expand-md .navbar-nav .nav-link { - padding-right: 0; - padding-left: 0; - } - - .navbar-expand-md > .container, - .navbar-expand-md > .container-fluid, - .navbar-expand-md > .container-sm, - .navbar-expand-md > .container-md, - .navbar-expand-md > .container-lg, - .navbar-expand-md > .container-xl { - flex-wrap: nowrap; - } - - .navbar-expand-md .navbar-collapse { - display: flex !important; - flex-basis: auto; - } - - .navbar-expand-md .navbar-toggler { - display: none; - } -} - -@media (max-width: 991.98px) { - .navbar-expand-lg > .container, - .navbar-expand-lg > .container-fluid, - .navbar-expand-lg > .container-sm, - .navbar-expand-lg > .container-md, - .navbar-expand-lg > .container-lg, - .navbar-expand-lg > .container-xl { - padding-right: 0; - padding-left: 0; - } -} - -@media (min-width: 992px) { - .navbar-expand-lg { - flex-flow: row nowrap; - justify-content: flex-start; - } - - .navbar-expand-lg .navbar-nav { - flex-direction: row; - } - - .navbar-expand-lg .navbar-nav .dropdown-menu { - position: absolute; - } - - .navbar-expand-lg .navbar-nav .nav-link { - padding-right: 0; - padding-left: 0; - } - - .navbar-expand-lg > .container, - .navbar-expand-lg > .container-fluid, - .navbar-expand-lg > .container-sm, - .navbar-expand-lg > .container-md, - .navbar-expand-lg > .container-lg, - .navbar-expand-lg > .container-xl { - flex-wrap: nowrap; - } - - .navbar-expand-lg .navbar-collapse { - display: flex !important; - flex-basis: auto; - } - - .navbar-expand-lg .navbar-toggler { - display: none; - } -} - -@media (max-width: 1199.98px) { - .navbar-expand-xl > .container, - .navbar-expand-xl > .container-fluid, - .navbar-expand-xl > .container-sm, - .navbar-expand-xl > .container-md, - .navbar-expand-xl > .container-lg, - .navbar-expand-xl > .container-xl { - padding-right: 0; - padding-left: 0; - } -} - -@media (min-width: 1200px) { - .navbar-expand-xl { - flex-flow: row nowrap; - justify-content: flex-start; - } - - .navbar-expand-xl .navbar-nav { - flex-direction: row; - } - - .navbar-expand-xl .navbar-nav .dropdown-menu { - position: absolute; - } - - .navbar-expand-xl .navbar-nav .nav-link { - padding-right: 0; - padding-left: 0; - } - - .navbar-expand-xl > .container, - .navbar-expand-xl > .container-fluid, - .navbar-expand-xl > .container-sm, - .navbar-expand-xl > .container-md, - .navbar-expand-xl > .container-lg, - .navbar-expand-xl > .container-xl { - flex-wrap: nowrap; - } - - .navbar-expand-xl .navbar-collapse { - display: flex !important; - flex-basis: auto; - } - - .navbar-expand-xl .navbar-toggler { - display: none; - } -} - -.navbar-expand { - flex-flow: row nowrap; - justify-content: flex-start; -} - -.navbar-expand > .container, -.navbar-expand > .container-fluid, -.navbar-expand > .container-sm, -.navbar-expand > .container-md, -.navbar-expand > .container-lg, -.navbar-expand > .container-xl { - padding-right: 0; - padding-left: 0; -} - -.navbar-expand .navbar-nav { - flex-direction: row; -} - -.navbar-expand .navbar-nav .dropdown-menu { - position: absolute; -} - -.navbar-expand .navbar-nav .nav-link { - padding-right: 0; - padding-left: 0; -} - -.navbar-expand > .container, -.navbar-expand > .container-fluid, -.navbar-expand > .container-sm, -.navbar-expand > .container-md, -.navbar-expand > .container-lg, -.navbar-expand > .container-xl { - flex-wrap: nowrap; -} - -.navbar-expand .navbar-collapse { - display: flex !important; - flex-basis: auto; -} - -.navbar-expand .navbar-toggler { - display: none; -} - -.navbar-light .navbar-brand { - color: rgba(0, 0, 0, 0.9); -} - -.navbar-light .navbar-brand:hover, -.navbar-light .navbar-brand:focus { - color: rgba(0, 0, 0, 0.9); -} - -.navbar-light .navbar-nav .nav-link { - color: rgba(0, 0, 0, 0.5); -} - -.navbar-light .navbar-nav .nav-link:hover, -.navbar-light .navbar-nav .nav-link:focus { - color: rgba(0, 0, 0, 0.7); -} - -.navbar-light .navbar-nav .nav-link.disabled { - color: rgba(0, 0, 0, 0.3); -} - -.navbar-light .navbar-nav .show > .nav-link, -.navbar-light .navbar-nav .active > .nav-link, -.navbar-light .navbar-nav .nav-link.show, -.navbar-light .navbar-nav .nav-link.active { - color: rgba(0, 0, 0, 0.9); -} - -.navbar-light .navbar-toggler { - color: rgba(0, 0, 0, 0.5); - border-color: rgba(0, 0, 0, 0.1); -} - -.navbar-light .navbar-toggler-icon { - background-image: url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' width='30' height='30' viewBox='0 0 30 30'%3e%3cpath stroke='rgba%280, 0, 0, 0.5%29' stroke-linecap='round' stroke-miterlimit='10' stroke-width='2' d='M4 7h22M4 15h22M4 23h22'/%3e%3c/svg%3e"); -} - -.navbar-light .navbar-text { - color: rgba(0, 0, 0, 0.5); -} - -.navbar-light .navbar-text a { - color: rgba(0, 0, 0, 0.9); -} - -.navbar-light .navbar-text a:hover, -.navbar-light .navbar-text a:focus { - color: rgba(0, 0, 0, 0.9); -} - -.navbar-dark .navbar-brand { - color: #fff; -} - -.navbar-dark .navbar-brand:hover, -.navbar-dark .navbar-brand:focus { - color: #fff; -} - -.navbar-dark .navbar-nav .nav-link { - color: rgba(255, 255, 255, 0.7); -} - -.navbar-dark .navbar-nav .nav-link:hover, -.navbar-dark .navbar-nav .nav-link:focus { - color: rgba(255, 255, 255, 0.75); -} - -.navbar-dark .navbar-nav .nav-link.disabled { - color: rgba(255, 255, 255, 0.25); -} - -.navbar-dark .navbar-nav .show > .nav-link, -.navbar-dark .navbar-nav .active > .nav-link, -.navbar-dark .navbar-nav .nav-link.show, -.navbar-dark .navbar-nav .nav-link.active { - color: #fff; -} - -.navbar-dark .navbar-toggler { - color: rgba(255, 255, 255, 0.7); - border-color: rgba(255, 255, 255, 0.1); -} - -.navbar-dark .navbar-toggler-icon { - background-image: url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' width='30' height='30' viewBox='0 0 30 30'%3e%3cpath stroke='rgba%28255, 255, 255, 0.7%29' stroke-linecap='round' stroke-miterlimit='10' stroke-width='2' d='M4 7h22M4 15h22M4 23h22'/%3e%3c/svg%3e"); -} - -.navbar-dark .navbar-text { - color: rgba(255, 255, 255, 0.7); -} - -.navbar-dark .navbar-text a { - color: #fff; -} - -.navbar-dark .navbar-text a:hover, -.navbar-dark .navbar-text a:focus { - color: #fff; -} - -.nav { - display: flex; - flex-wrap: wrap; - padding-left: 0; - margin-bottom: 0; - list-style: none; -} - -.nav-link { - display: block; - padding: 0 1rem; -} - -.nav-link:hover, -.nav-link:focus { - text-decoration: none; -} - -.nav-link.disabled { - color: #6c757d; - pointer-events: none; - cursor: default; -} - -.nav-tabs { - border-bottom: 1px solid #dee2e6; -} - -.nav-tabs .nav-item { - margin-bottom: -1px; -} - -.nav-tabs .nav-link { - border: 1px solid transparent; - border-top-left-radius: 0.25rem; - border-top-right-radius: 0.25rem; -} - -.nav-tabs .nav-link:hover, -.nav-tabs .nav-link:focus { - border-color: #e9ecef #e9ecef #dee2e6; -} - -.nav-tabs .nav-link.disabled { - color: #6c757d; - background-color: transparent; - border-color: transparent; -} - -.nav-tabs .nav-link.active, -.nav-tabs .nav-item.show .nav-link { - color: #495057; - background-color: #eceeef; - border-color: #dee2e6 #dee2e6 #eceeef; -} - -.nav-tabs .dropdown-menu { - margin-top: -1px; - border-top-left-radius: 0; - border-top-right-radius: 0; -} - -.nav-pills .nav-link { - border-radius: 0.25rem; -} - -.nav-pills .nav-link.active, -.nav-pills .show > .nav-link { - color: #fff; - background-color: #007bff; -} - -.nav-fill > .nav-link, -.nav-fill .nav-item { - flex: 1 1 auto; - text-align: center; -} - -.nav-justified > .nav-link, -.nav-justified .nav-item { - flex-basis: 0; - flex-grow: 1; - text-align: center; -} - -.tab-content > .tab-pane { - display: none; -} - -.tab-content > .active { - display: block; -} - -.table, -.pbTable { - width: 100%; - margin-bottom: 1rem; - color: #797F90; -} - -.table th, -.pbTable th, -.table td, -.pbTable td { - padding: 0.75rem; - vertical-align: top; - border-top: 1px solid #dddfe3; -} - -.table thead th, -.pbTable thead th { - vertical-align: bottom; - border-bottom: 2px solid #dddfe3; -} - -.table tbody + tbody, -.pbTable tbody + tbody { - border-top: 2px solid #dddfe3; -} - -.table-sm th, -.table-sm td { - padding: 0.3rem; -} - -.table-bordered, -.pbTable { - border: 1px solid #dddfe3; -} - -.table-bordered th, -.pbTable th, -.table-bordered td, -.pbTable td { - border: 1px solid #dddfe3; -} - -.table-bordered thead th, -.pbTable thead th, -.table-bordered thead td, -.pbTable thead td { - border-bottom-width: 2px; -} - -.table-borderless th, -.table-borderless td, -.table-borderless thead th, -.table-borderless tbody + tbody { - border: 0; -} - -.table-striped tbody tr:nth-of-type(odd), -.pbTable tbody tr:nth-of-type(odd) { - background-color: #f8f9f9; -} - -.table-hover tbody tr:hover { - color: #797F90; - background-color: rgba(0, 0, 0, 0.075); -} - -.table-primary, -.table-primary > th, -.table-primary > td { - background-color: #b8daff; -} - -.table-primary th, -.table-primary td, -.table-primary thead th, -.table-primary tbody + tbody { - border-color: #7abaff; -} - -.table-hover .table-primary:hover { - background-color: #9fcdff; -} - -.table-hover .table-primary:hover > td, -.table-hover .table-primary:hover > th { - background-color: #9fcdff; -} - -.table-secondary, -.table-secondary > th, -.table-secondary > td { - background-color: #d6d8db; -} - -.table-secondary th, -.table-secondary td, -.table-secondary thead th, -.table-secondary tbody + tbody { - border-color: #b3b7bb; -} - -.table-hover .table-secondary:hover { - background-color: #c8cbcf; -} - -.table-hover .table-secondary:hover > td, -.table-hover .table-secondary:hover > th { - background-color: #c8cbcf; -} - -.table-success, -.table-success > th, -.table-success > td { - background-color: #c3e6cb; -} - -.table-success th, -.table-success td, -.table-success thead th, -.table-success tbody + tbody { - border-color: #8fd19e; -} - -.table-hover .table-success:hover { - background-color: #b1dfbb; -} - -.table-hover .table-success:hover > td, -.table-hover .table-success:hover > th { - background-color: #b1dfbb; -} - -.table-info, -.table-info > th, -.table-info > td { - background-color: #bee5eb; -} - -.table-info th, -.table-info td, -.table-info thead th, -.table-info tbody + tbody { - border-color: #86cfda; -} - -.table-hover .table-info:hover { - background-color: #abdde5; -} - -.table-hover .table-info:hover > td, -.table-hover .table-info:hover > th { - background-color: #abdde5; -} - -.table-warning, -.table-warning > th, -.table-warning > td { - background-color: #ffeeba; -} - -.table-warning th, -.table-warning td, -.table-warning thead th, -.table-warning tbody + tbody { - border-color: #ffdf7e; -} - -.table-hover .table-warning:hover { - background-color: #ffe8a1; -} - -.table-hover .table-warning:hover > td, -.table-hover .table-warning:hover > th { - background-color: #ffe8a1; -} - -.table-danger, -.table-danger > th, -.table-danger > td { - background-color: #f5c6cb; -} - -.table-danger th, -.table-danger td, -.table-danger thead th, -.table-danger tbody + tbody { - border-color: #ed969e; -} - -.table-hover .table-danger:hover { - background-color: #f1b0b7; -} - -.table-hover .table-danger:hover > td, -.table-hover .table-danger:hover > th { - background-color: #f1b0b7; -} - -.table-light, -.table-light > th, -.table-light > td { - background-color: #fdfdfe; -} - -.table-light th, -.table-light td, -.table-light thead th, -.table-light tbody + tbody { - border-color: #fbfcfc; -} - -.table-hover .table-light:hover { - background-color: #ececf6; -} - -.table-hover .table-light:hover > td, -.table-hover .table-light:hover > th { - background-color: #ececf6; -} - -.table-dark, -.table-dark > th, -.table-dark > td { - background-color: #c6c8ca; -} - -.table-dark th, -.table-dark td, -.table-dark thead th, -.table-dark tbody + tbody { - border-color: #95999c; -} - -.table-hover .table-dark:hover { - background-color: #b9bbbe; -} - -.table-hover .table-dark:hover > td, -.table-hover .table-dark:hover > th { - background-color: #b9bbbe; -} - -.table-active, -.table-active > th, -.table-active > td { - background-color: rgba(0, 0, 0, 0.075); -} - -.table-hover .table-active:hover { - background-color: rgba(0, 0, 0, 0.075); -} - -.table-hover .table-active:hover > td, -.table-hover .table-active:hover > th { - background-color: rgba(0, 0, 0, 0.075); -} - -.table .thead-dark th, -.pbTable .thead-dark th { - color: #fff; - background-color: #343a40; - border-color: #454d55; -} - -.table .thead-light th, -.pbTable .thead-light th { - color: #495057; - background-color: #e9ecef; - border-color: #dddfe3; -} - -.table-dark { - color: #fff; - background-color: #343a40; -} - -.table-dark th, -.table-dark td, -.table-dark thead th { - border-color: #454d55; -} - -.table-dark.table-bordered, -.table-dark.pbTable { - border: 0; -} - -.table-dark.table-striped tbody tr:nth-of-type(odd), -.table-dark.pbTable tbody tr:nth-of-type(odd) { - background-color: rgba(255, 255, 255, 0.05); -} - -.table-dark.table-hover tbody tr:hover { - color: #fff; - background-color: rgba(255, 255, 255, 0.075); -} - -@media (max-width: 575.98px) { - .table-responsive-sm { - display: block; - width: 100%; - overflow-x: auto; - -webkit-overflow-scrolling: touch; - } - - .table-responsive-sm > .table-bordered, - .table-responsive-sm > .pbTable { - border: 0; - } -} - -@media (max-width: 767.98px) { - .table-responsive-md { - display: block; - width: 100%; - overflow-x: auto; - -webkit-overflow-scrolling: touch; - } - - .table-responsive-md > .table-bordered, - .table-responsive-md > .pbTable { - border: 0; - } -} - -@media (max-width: 991.98px) { - .table-responsive-lg { - display: block; - width: 100%; - overflow-x: auto; - -webkit-overflow-scrolling: touch; - } - - .table-responsive-lg > .table-bordered, - .table-responsive-lg > .pbTable { - border: 0; - } -} - -@media (max-width: 1199.98px) { - .table-responsive-xl { - display: block; - width: 100%; - overflow-x: auto; - -webkit-overflow-scrolling: touch; - } - - .table-responsive-xl > .table-bordered, - .table-responsive-xl > .pbTable { - border: 0; - } -} - -.table-responsive { - display: block; - width: 100%; - overflow-x: auto; - -webkit-overflow-scrolling: touch; -} - -.table-responsive > .table-bordered, -.table-responsive > .pbTable { - border: 0; -} - -.card { - position: relative; - display: flex; - flex-direction: column; - min-width: 0; - word-wrap: break-word; - background-color: #fff; - background-clip: border-box; - border: 1px solid rgba(0, 0, 0, 0.125); - border-radius: 0; -} - -.card > hr { - margin-right: 0; - margin-left: 0; -} - -.card > .list-group { - border-top: inherit; - border-bottom: inherit; -} - -.card > .list-group:first-child { - border-top-width: 0; - border-top-left-radius: 0; - border-top-right-radius: 0; -} - -.card > .list-group:last-child { - border-bottom-width: 0; - border-bottom-right-radius: 0; - border-bottom-left-radius: 0; -} - -.card > .card-header + .list-group, -.card > .list-group + .card-footer { - border-top: 0; -} - -.card-body { - flex: 1 1 auto; - min-height: 1px; - padding: 30px; -} - -.card-title { - margin-bottom: 0.75rem; -} - -.card-subtitle { - margin-top: -0.375rem; - margin-bottom: 0; -} - -.card-text:last-child { - margin-bottom: 0; -} - -.card-link:hover { - text-decoration: none; -} - -.card-link + .card-link { - margin-left: 30px; -} - -.card-header { - padding: 0.75rem 30px; - margin-bottom: 0; - background-color: rgba(0, 0, 0, 0.03); - border-bottom: 1px solid rgba(0, 0, 0, 0.125); -} - -.card-header:first-child { - border-radius: 0 0 0 0; -} - -.card-footer { - padding: 0.75rem 30px; - background-color: rgba(0, 0, 0, 0.03); - border-top: 1px solid rgba(0, 0, 0, 0.125); -} - -.card-footer:last-child { - border-radius: 0 0 0 0; -} - -.card-header-tabs { - margin-right: -15px; - margin-bottom: -0.75rem; - margin-left: -15px; - border-bottom: 0; -} - -.card-header-pills { - margin-right: -15px; - margin-left: -15px; -} - -.card-img-overlay { - position: absolute; - top: 0; - right: 0; - bottom: 0; - left: 0; - padding: 1.25rem; - border-radius: 0; -} - -.card-img, -.card-img-top, -.card-img-bottom { - flex-shrink: 0; - width: 100%; -} - -.card-img, -.card-img-top { - border-top-left-radius: 0; - border-top-right-radius: 0; -} - -.card-img, -.card-img-bottom { - border-bottom-right-radius: 0; - border-bottom-left-radius: 0; -} - -.card-deck .card { - margin-bottom: 10px; -} - -@media (min-width: 576px) { - .card-deck { - display: flex; - flex-flow: row wrap; - margin-right: -10px; - margin-left: -10px; - } - - .card-deck .card { - flex: 1 0 0%; - margin-right: 10px; - margin-bottom: 0; - margin-left: 10px; - } -} - -.card-group > .card { - margin-bottom: 10px; -} - -@media (min-width: 576px) { - .card-group { - display: flex; - flex-flow: row wrap; - } - - .card-group > .card { - flex: 1 0 0%; - margin-bottom: 0; - } - - .card-group > .card + .card { - margin-left: 0; - border-left: 0; - } - - .card-group > .card:not(:last-child) { - border-top-right-radius: 0; - border-bottom-right-radius: 0; - } - - .card-group > .card:not(:last-child) .card-img-top, - .card-group > .card:not(:last-child) .card-header { - border-top-right-radius: 0; - } - - .card-group > .card:not(:last-child) .card-img-bottom, - .card-group > .card:not(:last-child) .card-footer { - border-bottom-right-radius: 0; - } - - .card-group > .card:not(:first-child) { - border-top-left-radius: 0; - border-bottom-left-radius: 0; - } - - .card-group > .card:not(:first-child) .card-img-top, - .card-group > .card:not(:first-child) .card-header { - border-top-left-radius: 0; - } - - .card-group > .card:not(:first-child) .card-img-bottom, - .card-group > .card:not(:first-child) .card-footer { - border-bottom-left-radius: 0; - } -} - -.card-columns .card { - margin-bottom: 0.75rem; -} - -@media (min-width: 576px) { - .card-columns { - -moz-column-count: 3; - column-count: 3; - -moz-column-gap: 1.25rem; - column-gap: 1.25rem; - orphans: 1; - widows: 1; - } - - .card-columns .card { - display: inline-block; - width: 100%; - } -} - -.accordion { - overflow-anchor: none; -} - -.accordion > .card { - overflow: hidden; -} - -.accordion > .card:not(:last-of-type) { - border-bottom: 0; - border-bottom-right-radius: 0; - border-bottom-left-radius: 0; -} - -.accordion > .card:not(:first-of-type) { - border-top-left-radius: 0; - border-top-right-radius: 0; -} - -.accordion > .card > .card-header { - border-radius: 0; - margin-bottom: -1px; -} - -code { - font-size: 87.5%; - color: #e83e8c; - word-wrap: break-word; -} - -a > code { - color: inherit; -} - -kbd { - padding: 0.2rem 0.4rem; - font-size: 87.5%; - color: #fff; - background-color: #212529; - border-radius: 0.2rem; -} - -kbd kbd { - padding: 0; - font-size: 100%; - font-weight: 700; -} - -pre { - display: block; - font-size: 87.5%; - color: #212529; -} - -pre code { - font-size: inherit; - color: inherit; - word-break: normal; -} - -.pre-scrollable { - max-height: 340px; - overflow-y: scroll; -} - -.alert, -.pb-alert { - position: relative; - padding: 0.75rem 1.25rem; - margin-bottom: 1rem; - border: 1px solid transparent; - border-radius: 0.25rem; -} - -.alert-heading { - color: inherit; -} - -.alert-link { - font-weight: 700; -} - -.alert-dismissible { - padding-right: 4rem; -} - -.alert-dismissible .close { - position: absolute; - top: 0; - right: 0; - z-index: 2; - padding: 0.75rem 1.25rem; - color: inherit; -} - -.alert-primary { - color: #004085; - background-color: #cce5ff; - border-color: #b8daff; -} - -.alert-primary hr { - border-top-color: #9fcdff; -} - -.alert-primary .alert-link { - color: #002752; -} - -.alert-secondary { - color: #383d41; - background-color: #e2e3e5; - border-color: #d6d8db; -} - -.alert-secondary hr { - border-top-color: #c8cbcf; -} - -.alert-secondary .alert-link { - color: #202326; -} - -.alert-success { - color: #155724; - background-color: #d4edda; - border-color: #c3e6cb; -} - -.alert-success hr { - border-top-color: #b1dfbb; -} - -.alert-success .alert-link { - color: #0b2e13; -} - -.alert-info, -.pb-alert-tip { - color: #0c5460; - background-color: #d1ecf1; - border-color: #bee5eb; -} - -.alert-info hr, -.pb-alert-tip hr { - border-top-color: #abdde5; -} - -.alert-info .alert-link, -.pb-alert-tip .alert-link { - color: #062c33; -} - -.alert-warning, -.pb-alert-warning { - color: #856404; - background-color: #fff3cd; - border-color: #ffeeba; -} - -.alert-warning hr, -.pb-alert-warning hr { - border-top-color: #ffe8a1; -} - -.alert-warning .alert-link, -.pb-alert-warning .alert-link { - color: #533f03; -} - -.alert-danger, -.pb-alert-important { - color: #721c24; - background-color: #f8d7da; - border-color: #f5c6cb; -} - -.alert-danger hr, -.pb-alert-important hr { - border-top-color: #f1b0b7; -} - -.alert-danger .alert-link, -.pb-alert-important .alert-link { - color: #491217; -} - -.alert-light { - color: #818182; - background-color: #fefefe; - border-color: #fdfdfe; -} - -.alert-light hr { - border-top-color: #ececf6; -} - -.alert-light .alert-link { - color: #686868; -} - -.alert-dark { - color: #1b1e21; - background-color: #d6d8d9; - border-color: #c6c8ca; -} - -.alert-dark hr { - border-top-color: #b9bbbe; -} - -.alert-dark .alert-link { - color: #040505; -} - -.modal-open { - overflow: hidden; -} - -.modal-open .modal { - overflow-x: hidden; - overflow-y: auto; -} - -.modal { - position: fixed; - top: 0; - left: 0; - z-index: 1050; - display: none; - width: 100%; - height: 100%; - overflow: hidden; - outline: 0; -} - -.modal-dialog { - position: relative; - width: auto; - margin: 0.5rem; - pointer-events: none; -} - -.modal.fade .modal-dialog { - transition: transform 0.3s ease-out; - transform: translate(0, -50px); -} - -@media (prefers-reduced-motion: reduce) { - .modal.fade .modal-dialog { - transition: none; - } -} - -.modal.show .modal-dialog { - transform: none; -} - -.modal.modal-static .modal-dialog { - transform: scale(1.02); -} - -.modal-dialog-scrollable { - display: flex; - max-height: calc(100% - 1rem); -} - -.modal-dialog-scrollable .modal-content { - max-height: calc(100vh - 1rem); - overflow: hidden; -} - -.modal-dialog-scrollable .modal-header, -.modal-dialog-scrollable .modal-footer { - flex-shrink: 0; -} - -.modal-dialog-scrollable .modal-body { - overflow-y: auto; -} - -.modal-dialog-centered { - display: flex; - align-items: center; - min-height: calc(100% - 1rem); -} - -.modal-dialog-centered::before { - display: block; - height: calc(100vh - 1rem); - height: -webkit-min-content; - height: -moz-min-content; - height: min-content; - content: ""; -} - -.modal-dialog-centered.modal-dialog-scrollable { - flex-direction: column; - justify-content: center; - height: 100%; -} - -.modal-dialog-centered.modal-dialog-scrollable .modal-content { - max-height: none; -} - -.modal-dialog-centered.modal-dialog-scrollable::before { - content: none; -} - -.modal-content { - position: relative; - display: flex; - flex-direction: column; - width: 100%; - pointer-events: auto; - background-color: #fff; - background-clip: padding-box; - border: 1px solid rgba(0, 0, 0, 0.2); - border-radius: 0.3rem; - outline: 0; -} - -.modal-backdrop { - position: fixed; - top: 0; - left: 0; - z-index: 1040; - width: 100vw; - height: 100vh; - background-color: #000; -} - -.modal-backdrop.fade { - opacity: 0; -} - -.modal-backdrop.show { - opacity: 0.5; -} - -.modal-header { - display: flex; - align-items: flex-start; - justify-content: space-between; - padding: 1rem 1rem; - border-bottom: 1px solid #dee2e6; - border-top-left-radius: calc(0.3rem - 1px); - border-top-right-radius: calc(0.3rem - 1px); -} - -.modal-header .close { - padding: 1rem 1rem; - margin: -1rem -1rem -1rem auto; -} - -.modal-title { - margin-bottom: 0; - line-height: 1.5; -} - -.modal-body { - position: relative; - flex: 1 1 auto; - padding: 1rem; -} - -.modal-footer { - display: flex; - flex-wrap: wrap; - align-items: center; - justify-content: flex-end; - padding: 0.75rem; - border-top: 1px solid #dee2e6; - border-bottom-right-radius: calc(0.3rem - 1px); - border-bottom-left-radius: calc(0.3rem - 1px); -} - -.modal-footer > * { - margin: 0.25rem; -} - -.modal-scrollbar-measure { - position: absolute; - top: -9999px; - width: 50px; - height: 50px; - overflow: scroll; -} - -@media (min-width: 576px) { - .modal-dialog { - max-width: 500px; - margin: 1.75rem auto; - } - - .modal-dialog-scrollable { - max-height: calc(100% - 3.5rem); - } - - .modal-dialog-scrollable .modal-content { - max-height: calc(100vh - 3.5rem); - } - - .modal-dialog-centered { - min-height: calc(100% - 3.5rem); - } - - .modal-dialog-centered::before { - height: calc(100vh - 3.5rem); - height: -webkit-min-content; - height: -moz-min-content; - height: min-content; - } - - .modal-sm { - max-width: 300px; - } -} - -@media (min-width: 992px) { - .modal-lg, - .modal-xl { - max-width: 800px; - } -} - -@media (min-width: 1200px) { - .modal-xl { - max-width: 1140px; - } -} - -.align-baseline { - vertical-align: baseline !important; -} - -.align-top { - vertical-align: top !important; -} - -.align-middle { - vertical-align: middle !important; -} - -.align-bottom { - vertical-align: bottom !important; -} - -.align-text-bottom { - vertical-align: text-bottom !important; -} - -.align-text-top { - vertical-align: text-top !important; -} - -.bg-primary { - background-color: #007bff !important; -} - -a.bg-primary:hover, -a.bg-primary:focus, -button.bg-primary:hover, -button.bg-primary:focus { - background-color: #0062cc !important; -} - -.bg-secondary { - background-color: #6c757d !important; -} - -a.bg-secondary:hover, -a.bg-secondary:focus, -button.bg-secondary:hover, -button.bg-secondary:focus { - background-color: #545b62 !important; -} - -.bg-success { - background-color: #28a745 !important; -} - -a.bg-success:hover, -a.bg-success:focus, -button.bg-success:hover, -button.bg-success:focus { - background-color: #1e7e34 !important; -} - -.bg-info { - background-color: #17a2b8 !important; -} - -a.bg-info:hover, -a.bg-info:focus, -button.bg-info:hover, -button.bg-info:focus { - background-color: #117a8b !important; -} - -.bg-warning { - background-color: #ffc107 !important; -} - -a.bg-warning:hover, -a.bg-warning:focus, -button.bg-warning:hover, -button.bg-warning:focus { - background-color: #d39e00 !important; -} - -.bg-danger { - background-color: #dc3545 !important; -} - -a.bg-danger:hover, -a.bg-danger:focus, -button.bg-danger:hover, -button.bg-danger:focus { - background-color: #bd2130 !important; -} - -.bg-light { - background-color: #f8f9fa !important; -} - -a.bg-light:hover, -a.bg-light:focus, -button.bg-light:hover, -button.bg-light:focus { - background-color: #dae0e5 !important; -} - -.bg-dark { - background-color: #343a40 !important; -} - -a.bg-dark:hover, -a.bg-dark:focus, -button.bg-dark:hover, -button.bg-dark:focus { - background-color: #1d2124 !important; -} - -.bg-white { - background-color: #fff !important; -} - -.bg-transparent { - background-color: transparent !important; -} - -.border { - border: 1px solid #dee2e6 !important; -} - -.border-top { - border-top: 1px solid #dee2e6 !important; -} - -.border-right { - border-right: 1px solid #dee2e6 !important; -} - -.border-bottom { - border-bottom: 1px solid #dee2e6 !important; -} - -.border-left { - border-left: 1px solid #dee2e6 !important; -} - -.border-0 { - border: 0 !important; -} - -.border-top-0 { - border-top: 0 !important; -} - -.border-right-0 { - border-right: 0 !important; -} - -.border-bottom-0 { - border-bottom: 0 !important; -} - -.border-left-0 { - border-left: 0 !important; -} - -.border-primary { - border-color: #007bff !important; -} - -.border-secondary { - border-color: #6c757d !important; -} - -.border-success { - border-color: #28a745 !important; -} - -.border-info { - border-color: #17a2b8 !important; -} - -.border-warning { - border-color: #ffc107 !important; -} - -.border-danger { - border-color: #dc3545 !important; -} - -.border-light { - border-color: #f8f9fa !important; -} - -.border-dark { - border-color: #343a40 !important; -} - -.border-white { - border-color: #fff !important; -} - -.rounded-sm { - border-radius: 0.2rem !important; -} - -.rounded { - border-radius: 0.25rem !important; -} - -.rounded-top { - border-top-left-radius: 0.25rem !important; - border-top-right-radius: 0.25rem !important; -} - -.rounded-right { - border-top-right-radius: 0.25rem !important; - border-bottom-right-radius: 0.25rem !important; -} - -.rounded-bottom { - border-bottom-right-radius: 0.25rem !important; - border-bottom-left-radius: 0.25rem !important; -} - -.rounded-left { - border-top-left-radius: 0.25rem !important; - border-bottom-left-radius: 0.25rem !important; -} - -.rounded-lg { - border-radius: 0.3rem !important; -} - -.rounded-circle { - border-radius: 50% !important; -} - -.rounded-pill { - border-radius: 50rem !important; -} - -.rounded-0 { - border-radius: 0 !important; -} - -.clearfix::after { - display: block; - clear: both; - content: ""; -} - -.d-none { - display: none !important; -} - -.d-inline { - display: inline !important; -} - -.d-inline-block { - display: inline-block !important; -} - -.d-block { - display: block !important; -} - -.d-table { - display: table !important; -} - -.d-table-row { - display: table-row !important; -} - -.d-table-cell { - display: table-cell !important; -} - -.d-flex { - display: flex !important; -} - -.d-inline-flex { - display: inline-flex !important; -} - -@media (min-width: 576px) { - .d-sm-none { - display: none !important; - } - - .d-sm-inline { - display: inline !important; - } - - .d-sm-inline-block { - display: inline-block !important; - } - - .d-sm-block { - display: block !important; - } - - .d-sm-table { - display: table !important; - } - - .d-sm-table-row { - display: table-row !important; - } - - .d-sm-table-cell { - display: table-cell !important; - } - - .d-sm-flex { - display: flex !important; - } - - .d-sm-inline-flex { - display: inline-flex !important; - } -} - -@media (min-width: 768px) { - .d-md-none { - display: none !important; - } - - .d-md-inline { - display: inline !important; - } - - .d-md-inline-block { - display: inline-block !important; - } - - .d-md-block { - display: block !important; - } - - .d-md-table { - display: table !important; - } - - .d-md-table-row { - display: table-row !important; - } - - .d-md-table-cell { - display: table-cell !important; - } - - .d-md-flex { - display: flex !important; - } - - .d-md-inline-flex { - display: inline-flex !important; - } -} - -@media (min-width: 992px) { - .d-lg-none { - display: none !important; - } - - .d-lg-inline { - display: inline !important; - } - - .d-lg-inline-block { - display: inline-block !important; - } - - .d-lg-block { - display: block !important; - } - - .d-lg-table { - display: table !important; - } - - .d-lg-table-row { - display: table-row !important; - } - - .d-lg-table-cell { - display: table-cell !important; - } - - .d-lg-flex { - display: flex !important; - } - - .d-lg-inline-flex { - display: inline-flex !important; - } -} - -@media (min-width: 1200px) { - .d-xl-none { - display: none !important; - } - - .d-xl-inline { - display: inline !important; - } - - .d-xl-inline-block { - display: inline-block !important; - } - - .d-xl-block { - display: block !important; - } - - .d-xl-table { - display: table !important; - } - - .d-xl-table-row { - display: table-row !important; - } - - .d-xl-table-cell { - display: table-cell !important; - } - - .d-xl-flex { - display: flex !important; - } - - .d-xl-inline-flex { - display: inline-flex !important; - } -} - -@media print { - .d-print-none { - display: none !important; - } - - .d-print-inline { - display: inline !important; - } - - .d-print-inline-block { - display: inline-block !important; - } - - .d-print-block { - display: block !important; - } - - .d-print-table { - display: table !important; - } - - .d-print-table-row { - display: table-row !important; - } - - .d-print-table-cell { - display: table-cell !important; - } - - .d-print-flex { - display: flex !important; - } - - .d-print-inline-flex { - display: inline-flex !important; - } -} - -.embed-responsive { - position: relative; - display: block; - width: 100%; - padding: 0; - overflow: hidden; -} - -.embed-responsive::before { - display: block; - content: ""; -} - -.embed-responsive .embed-responsive-item, -.embed-responsive iframe, -.embed-responsive embed, -.embed-responsive object, -.embed-responsive video { - position: absolute; - top: 0; - bottom: 0; - left: 0; - width: 100%; - height: 100%; - border: 0; -} - -.embed-responsive-21by9::before { - padding-top: 42.8571428571%; -} - -.embed-responsive-16by9::before { - padding-top: 56.25%; -} - -.embed-responsive-4by3::before { - padding-top: 75%; -} - -.embed-responsive-1by1::before { - padding-top: 100%; -} - -.flex-row { - flex-direction: row !important; -} - -.flex-column { - flex-direction: column !important; -} - -.flex-row-reverse { - flex-direction: row-reverse !important; -} - -.flex-column-reverse { - flex-direction: column-reverse !important; -} - -.flex-wrap { - flex-wrap: wrap !important; -} - -.flex-nowrap { - flex-wrap: nowrap !important; -} - -.flex-wrap-reverse { - flex-wrap: wrap-reverse !important; -} - -.flex-fill { - flex: 1 1 auto !important; -} - -.flex-grow-0 { - flex-grow: 0 !important; -} - -.flex-grow-1 { - flex-grow: 1 !important; -} - -.flex-shrink-0 { - flex-shrink: 0 !important; -} - -.flex-shrink-1 { - flex-shrink: 1 !important; -} - -.justify-content-start { - justify-content: flex-start !important; -} - -.justify-content-end { - justify-content: flex-end !important; -} - -.justify-content-center { - justify-content: center !important; -} - -.justify-content-between { - justify-content: space-between !important; -} - -.justify-content-around { - justify-content: space-around !important; -} - -.align-items-start { - align-items: flex-start !important; -} - -.align-items-end { - align-items: flex-end !important; -} - -.align-items-center { - align-items: center !important; -} - -.align-items-baseline { - align-items: baseline !important; -} - -.align-items-stretch { - align-items: stretch !important; -} - -.align-content-start { - align-content: flex-start !important; -} - -.align-content-end { - align-content: flex-end !important; -} - -.align-content-center { - align-content: center !important; -} - -.align-content-between { - align-content: space-between !important; -} - -.align-content-around { - align-content: space-around !important; -} - -.align-content-stretch { - align-content: stretch !important; -} - -.align-self-auto { - align-self: auto !important; -} - -.align-self-start { - align-self: flex-start !important; -} - -.align-self-end { - align-self: flex-end !important; -} - -.align-self-center { - align-self: center !important; -} - -.align-self-baseline { - align-self: baseline !important; -} - -.align-self-stretch { - align-self: stretch !important; -} - -@media (min-width: 576px) { - .flex-sm-row { - flex-direction: row !important; - } - - .flex-sm-column { - flex-direction: column !important; - } - - .flex-sm-row-reverse { - flex-direction: row-reverse !important; - } - - .flex-sm-column-reverse { - flex-direction: column-reverse !important; - } - - .flex-sm-wrap { - flex-wrap: wrap !important; - } - - .flex-sm-nowrap { - flex-wrap: nowrap !important; - } - - .flex-sm-wrap-reverse { - flex-wrap: wrap-reverse !important; - } - - .flex-sm-fill { - flex: 1 1 auto !important; - } - - .flex-sm-grow-0 { - flex-grow: 0 !important; - } - - .flex-sm-grow-1 { - flex-grow: 1 !important; - } - - .flex-sm-shrink-0 { - flex-shrink: 0 !important; - } - - .flex-sm-shrink-1 { - flex-shrink: 1 !important; - } - - .justify-content-sm-start { - justify-content: flex-start !important; - } - - .justify-content-sm-end { - justify-content: flex-end !important; - } - - .justify-content-sm-center { - justify-content: center !important; - } - - .justify-content-sm-between { - justify-content: space-between !important; - } - - .justify-content-sm-around { - justify-content: space-around !important; - } - - .align-items-sm-start { - align-items: flex-start !important; - } - - .align-items-sm-end { - align-items: flex-end !important; - } - - .align-items-sm-center { - align-items: center !important; - } - - .align-items-sm-baseline { - align-items: baseline !important; - } - - .align-items-sm-stretch { - align-items: stretch !important; - } - - .align-content-sm-start { - align-content: flex-start !important; - } - - .align-content-sm-end { - align-content: flex-end !important; - } - - .align-content-sm-center { - align-content: center !important; - } - - .align-content-sm-between { - align-content: space-between !important; - } - - .align-content-sm-around { - align-content: space-around !important; - } - - .align-content-sm-stretch { - align-content: stretch !important; - } - - .align-self-sm-auto { - align-self: auto !important; - } - - .align-self-sm-start { - align-self: flex-start !important; - } - - .align-self-sm-end { - align-self: flex-end !important; - } - - .align-self-sm-center { - align-self: center !important; - } - - .align-self-sm-baseline { - align-self: baseline !important; - } - - .align-self-sm-stretch { - align-self: stretch !important; - } -} - -@media (min-width: 768px) { - .flex-md-row { - flex-direction: row !important; - } - - .flex-md-column { - flex-direction: column !important; - } - - .flex-md-row-reverse { - flex-direction: row-reverse !important; - } - - .flex-md-column-reverse { - flex-direction: column-reverse !important; - } - - .flex-md-wrap { - flex-wrap: wrap !important; - } - - .flex-md-nowrap { - flex-wrap: nowrap !important; - } - - .flex-md-wrap-reverse { - flex-wrap: wrap-reverse !important; - } - - .flex-md-fill { - flex: 1 1 auto !important; - } - - .flex-md-grow-0 { - flex-grow: 0 !important; - } - - .flex-md-grow-1 { - flex-grow: 1 !important; - } - - .flex-md-shrink-0 { - flex-shrink: 0 !important; - } - - .flex-md-shrink-1 { - flex-shrink: 1 !important; - } - - .justify-content-md-start { - justify-content: flex-start !important; - } - - .justify-content-md-end { - justify-content: flex-end !important; - } - - .justify-content-md-center { - justify-content: center !important; - } - - .justify-content-md-between { - justify-content: space-between !important; - } - - .justify-content-md-around { - justify-content: space-around !important; - } - - .align-items-md-start { - align-items: flex-start !important; - } - - .align-items-md-end { - align-items: flex-end !important; - } - - .align-items-md-center { - align-items: center !important; - } - - .align-items-md-baseline { - align-items: baseline !important; - } - - .align-items-md-stretch { - align-items: stretch !important; - } - - .align-content-md-start { - align-content: flex-start !important; - } - - .align-content-md-end { - align-content: flex-end !important; - } - - .align-content-md-center { - align-content: center !important; - } - - .align-content-md-between { - align-content: space-between !important; - } - - .align-content-md-around { - align-content: space-around !important; - } - - .align-content-md-stretch { - align-content: stretch !important; - } - - .align-self-md-auto { - align-self: auto !important; - } - - .align-self-md-start { - align-self: flex-start !important; - } - - .align-self-md-end { - align-self: flex-end !important; - } - - .align-self-md-center { - align-self: center !important; - } - - .align-self-md-baseline { - align-self: baseline !important; - } - - .align-self-md-stretch { - align-self: stretch !important; - } -} - -@media (min-width: 992px) { - .flex-lg-row { - flex-direction: row !important; - } - - .flex-lg-column { - flex-direction: column !important; - } - - .flex-lg-row-reverse { - flex-direction: row-reverse !important; - } - - .flex-lg-column-reverse { - flex-direction: column-reverse !important; - } - - .flex-lg-wrap { - flex-wrap: wrap !important; - } - - .flex-lg-nowrap { - flex-wrap: nowrap !important; - } - - .flex-lg-wrap-reverse { - flex-wrap: wrap-reverse !important; - } - - .flex-lg-fill { - flex: 1 1 auto !important; - } - - .flex-lg-grow-0 { - flex-grow: 0 !important; - } - - .flex-lg-grow-1 { - flex-grow: 1 !important; - } - - .flex-lg-shrink-0 { - flex-shrink: 0 !important; - } - - .flex-lg-shrink-1 { - flex-shrink: 1 !important; - } - - .justify-content-lg-start { - justify-content: flex-start !important; - } - - .justify-content-lg-end { - justify-content: flex-end !important; - } - - .justify-content-lg-center { - justify-content: center !important; - } - - .justify-content-lg-between { - justify-content: space-between !important; - } - - .justify-content-lg-around { - justify-content: space-around !important; - } - - .align-items-lg-start { - align-items: flex-start !important; - } - - .align-items-lg-end { - align-items: flex-end !important; - } - - .align-items-lg-center { - align-items: center !important; - } - - .align-items-lg-baseline { - align-items: baseline !important; - } - - .align-items-lg-stretch { - align-items: stretch !important; - } - - .align-content-lg-start { - align-content: flex-start !important; - } - - .align-content-lg-end { - align-content: flex-end !important; - } - - .align-content-lg-center { - align-content: center !important; - } - - .align-content-lg-between { - align-content: space-between !important; - } - - .align-content-lg-around { - align-content: space-around !important; - } - - .align-content-lg-stretch { - align-content: stretch !important; - } - - .align-self-lg-auto { - align-self: auto !important; - } - - .align-self-lg-start { - align-self: flex-start !important; - } - - .align-self-lg-end { - align-self: flex-end !important; - } - - .align-self-lg-center { - align-self: center !important; - } - - .align-self-lg-baseline { - align-self: baseline !important; - } - - .align-self-lg-stretch { - align-self: stretch !important; - } -} - -@media (min-width: 1200px) { - .flex-xl-row { - flex-direction: row !important; - } - - .flex-xl-column { - flex-direction: column !important; - } - - .flex-xl-row-reverse { - flex-direction: row-reverse !important; - } - - .flex-xl-column-reverse { - flex-direction: column-reverse !important; - } - - .flex-xl-wrap { - flex-wrap: wrap !important; - } - - .flex-xl-nowrap { - flex-wrap: nowrap !important; - } - - .flex-xl-wrap-reverse { - flex-wrap: wrap-reverse !important; - } - - .flex-xl-fill { - flex: 1 1 auto !important; - } - - .flex-xl-grow-0 { - flex-grow: 0 !important; - } - - .flex-xl-grow-1 { - flex-grow: 1 !important; - } - - .flex-xl-shrink-0 { - flex-shrink: 0 !important; - } - - .flex-xl-shrink-1 { - flex-shrink: 1 !important; - } - - .justify-content-xl-start { - justify-content: flex-start !important; - } - - .justify-content-xl-end { - justify-content: flex-end !important; - } - - .justify-content-xl-center { - justify-content: center !important; - } - - .justify-content-xl-between { - justify-content: space-between !important; - } - - .justify-content-xl-around { - justify-content: space-around !important; - } - - .align-items-xl-start { - align-items: flex-start !important; - } - - .align-items-xl-end { - align-items: flex-end !important; - } - - .align-items-xl-center { - align-items: center !important; - } - - .align-items-xl-baseline { - align-items: baseline !important; - } - - .align-items-xl-stretch { - align-items: stretch !important; - } - - .align-content-xl-start { - align-content: flex-start !important; - } - - .align-content-xl-end { - align-content: flex-end !important; - } - - .align-content-xl-center { - align-content: center !important; - } - - .align-content-xl-between { - align-content: space-between !important; - } - - .align-content-xl-around { - align-content: space-around !important; - } - - .align-content-xl-stretch { - align-content: stretch !important; - } - - .align-self-xl-auto { - align-self: auto !important; - } - - .align-self-xl-start { - align-self: flex-start !important; - } - - .align-self-xl-end { - align-self: flex-end !important; - } - - .align-self-xl-center { - align-self: center !important; - } - - .align-self-xl-baseline { - align-self: baseline !important; - } - - .align-self-xl-stretch { - align-self: stretch !important; - } -} - -.float-left { - float: left !important; -} - -.float-right { - float: right !important; -} - -.float-none { - float: none !important; -} - -@media (min-width: 576px) { - .float-sm-left { - float: left !important; - } - - .float-sm-right { - float: right !important; - } - - .float-sm-none { - float: none !important; - } -} - -@media (min-width: 768px) { - .float-md-left { - float: left !important; - } - - .float-md-right { - float: right !important; - } - - .float-md-none { - float: none !important; - } -} - -@media (min-width: 992px) { - .float-lg-left { - float: left !important; - } - - .float-lg-right { - float: right !important; - } - - .float-lg-none { - float: none !important; - } -} - -@media (min-width: 1200px) { - .float-xl-left { - float: left !important; - } - - .float-xl-right { - float: right !important; - } - - .float-xl-none { - float: none !important; - } -} - -.user-select-all { - -webkit-user-select: all !important; - -moz-user-select: all !important; - -ms-user-select: all !important; - user-select: all !important; -} - -.user-select-auto { - -webkit-user-select: auto !important; - -moz-user-select: auto !important; - -ms-user-select: auto !important; - user-select: auto !important; -} - -.user-select-none { - -webkit-user-select: none !important; - -moz-user-select: none !important; - -ms-user-select: none !important; - user-select: none !important; -} - -.overflow-auto { - overflow: auto !important; -} - -.overflow-hidden { - overflow: hidden !important; -} - -.position-static { - position: static !important; -} - -.position-relative { - position: relative !important; -} - -.position-absolute { - position: absolute !important; -} - -.position-fixed { - position: fixed !important; -} - -.position-sticky { - position: -webkit-sticky !important; - position: sticky !important; -} - -.fixed-top { - position: fixed; - top: 0; - right: 0; - left: 0; - z-index: 1030; -} - -.fixed-bottom { - position: fixed; - right: 0; - bottom: 0; - left: 0; - z-index: 1030; -} - -@supports ((position: -webkit-sticky) or (position: sticky)) { - .sticky-top { - position: -webkit-sticky; - position: sticky; - top: 0; - z-index: 1020; - } -} - -.sr-only { - position: absolute; - width: 1px; - height: 1px; - padding: 0; - margin: -1px; - overflow: hidden; - clip: rect(0, 0, 0, 0); - white-space: nowrap; - border: 0; -} - -.sr-only-focusable:active, -.sr-only-focusable:focus { - position: static; - width: auto; - height: auto; - overflow: visible; - clip: auto; - white-space: normal; -} - -.shadow-sm { - box-shadow: 0 0.125rem 0.25rem rgba(0, 0, 0, 0.075) !important; -} - -.shadow { - box-shadow: 0 0.5rem 1rem rgba(0, 0, 0, 0.15) !important; -} - -.shadow-lg { - box-shadow: 0 1rem 3rem rgba(0, 0, 0, 0.175) !important; -} - -.shadow-none { - box-shadow: none !important; -} - -.w-25 { - width: 25% !important; -} - -.w-50 { - width: 50% !important; -} - -.w-75 { - width: 75% !important; -} - -.w-100 { - width: 100% !important; -} - -.w-auto { - width: auto !important; -} - -.h-25 { - height: 25% !important; -} - -.h-50 { - height: 50% !important; -} - -.h-75 { - height: 75% !important; -} - -.h-100 { - height: 100% !important; -} - -.h-auto { - height: auto !important; -} - -.mw-100 { - max-width: 100% !important; -} - -.mh-100 { - max-height: 100% !important; -} - -.min-vw-100 { - min-width: 100vw !important; -} - -.min-vh-100 { - min-height: 100vh !important; -} - -.vw-100 { - width: 100vw !important; -} - -.vh-100 { - height: 100vh !important; -} - -.m-0 { - margin: 0 !important; -} - -.mt-0, -.my-0 { - margin-top: 0 !important; -} - -.mr-0, -.mx-0 { - margin-right: 0 !important; -} - -.mb-0, -.my-0 { - margin-bottom: 0 !important; -} - -.ml-0, -.mx-0 { - margin-left: 0 !important; -} - -.m-1 { - margin: 0.25rem !important; -} - -.mt-1, -.my-1 { - margin-top: 0.25rem !important; -} - -.mr-1, -.mx-1 { - margin-right: 0.25rem !important; -} - -.mb-1, -.my-1 { - margin-bottom: 0.25rem !important; -} - -.ml-1, -.mx-1 { - margin-left: 0.25rem !important; -} - -.m-2 { - margin: 0.5rem !important; -} - -.mt-2, -.my-2 { - margin-top: 0.5rem !important; -} - -.mr-2, -.mx-2 { - margin-right: 0.5rem !important; -} - -.mb-2, -.my-2 { - margin-bottom: 0.5rem !important; -} - -.ml-2, -.mx-2 { - margin-left: 0.5rem !important; -} - -.m-3 { - margin: 1rem !important; -} - -.mt-3, -.my-3 { - margin-top: 1rem !important; -} - -.mr-3, -.mx-3 { - margin-right: 1rem !important; -} - -.mb-3, -.my-3 { - margin-bottom: 1rem !important; -} - -.ml-3, -.mx-3 { - margin-left: 1rem !important; -} - -.m-4 { - margin: 1.5rem !important; -} - -.mt-4, -.my-4 { - margin-top: 1.5rem !important; -} - -.mr-4, -.mx-4 { - margin-right: 1.5rem !important; -} - -.mb-4, -.my-4 { - margin-bottom: 1.5rem !important; -} - -.ml-4, -.mx-4 { - margin-left: 1.5rem !important; -} - -.m-5 { - margin: 3rem !important; -} - -.mt-5, -.my-5 { - margin-top: 3rem !important; -} - -.mr-5, -.mx-5 { - margin-right: 3rem !important; -} - -.mb-5, -.my-5 { - margin-bottom: 3rem !important; -} - -.ml-5, -.mx-5 { - margin-left: 3rem !important; -} - -.m-6 { - margin: 3.75rem !important; -} - -.mt-6, -.my-6 { - margin-top: 3.75rem !important; -} - -.mr-6, -.mx-6 { - margin-right: 3.75rem !important; -} - -.mb-6, -.my-6 { - margin-bottom: 3.75rem !important; -} - -.ml-6, -.mx-6 { - margin-left: 3.75rem !important; -} - -.m-7 { - margin: 4.5rem !important; -} - -.mt-7, -.my-7 { - margin-top: 4.5rem !important; -} - -.mr-7, -.mx-7 { - margin-right: 4.5rem !important; -} - -.mb-7, -.my-7 { - margin-bottom: 4.5rem !important; -} - -.ml-7, -.mx-7 { - margin-left: 4.5rem !important; -} - -.m-8 { - margin: 5rem !important; -} - -.mt-8, -.my-8 { - margin-top: 5rem !important; -} - -.mr-8, -.mx-8 { - margin-right: 5rem !important; -} - -.mb-8, -.my-8 { - margin-bottom: 5rem !important; -} - -.ml-8, -.mx-8 { - margin-left: 5rem !important; -} - -.p-0 { - padding: 0 !important; -} - -.pt-0, -.py-0 { - padding-top: 0 !important; -} - -.pr-0, -.px-0 { - padding-right: 0 !important; -} - -.pb-0, -.py-0 { - padding-bottom: 0 !important; -} - -.pl-0, -.px-0 { - padding-left: 0 !important; -} - -.p-1 { - padding: 0.25rem !important; -} - -.pt-1, -.py-1 { - padding-top: 0.25rem !important; -} - -.pr-1, -.px-1 { - padding-right: 0.25rem !important; -} - -.pb-1, -.py-1 { - padding-bottom: 0.25rem !important; -} - -.pl-1, -.px-1 { - padding-left: 0.25rem !important; -} - -.p-2 { - padding: 0.5rem !important; -} - -.pt-2, -.py-2 { - padding-top: 0.5rem !important; -} - -.pr-2, -.px-2 { - padding-right: 0.5rem !important; -} - -.pb-2, -.py-2 { - padding-bottom: 0.5rem !important; -} - -.pl-2, -.px-2 { - padding-left: 0.5rem !important; -} - -.p-3 { - padding: 1rem !important; -} - -.pt-3, -.py-3 { - padding-top: 1rem !important; -} - -.pr-3, -.px-3 { - padding-right: 1rem !important; -} - -.pb-3, -.py-3 { - padding-bottom: 1rem !important; -} - -.pl-3, -.px-3 { - padding-left: 1rem !important; -} - -.p-4 { - padding: 1.5rem !important; -} - -.pt-4, -.py-4 { - padding-top: 1.5rem !important; -} - -.pr-4, -.px-4 { - padding-right: 1.5rem !important; -} - -.pb-4, -.py-4 { - padding-bottom: 1.5rem !important; -} - -.pl-4, -.px-4 { - padding-left: 1.5rem !important; -} - -.p-5 { - padding: 3rem !important; -} - -.pt-5, -.py-5 { - padding-top: 3rem !important; -} - -.pr-5, -.px-5 { - padding-right: 3rem !important; -} - -.pb-5, -.py-5 { - padding-bottom: 3rem !important; -} - -.pl-5, -.px-5 { - padding-left: 3rem !important; -} - -.p-6 { - padding: 3.75rem !important; -} - -.pt-6, -.py-6 { - padding-top: 3.75rem !important; -} - -.pr-6, -.px-6 { - padding-right: 3.75rem !important; -} - -.pb-6, -.py-6 { - padding-bottom: 3.75rem !important; -} - -.pl-6, -.px-6 { - padding-left: 3.75rem !important; -} - -.p-7 { - padding: 4.5rem !important; -} - -.pt-7, -.py-7 { - padding-top: 4.5rem !important; -} - -.pr-7, -.px-7 { - padding-right: 4.5rem !important; -} - -.pb-7, -.py-7 { - padding-bottom: 4.5rem !important; -} - -.pl-7, -.px-7 { - padding-left: 4.5rem !important; -} - -.p-8 { - padding: 5rem !important; -} - -.pt-8, -.py-8 { - padding-top: 5rem !important; -} - -.pr-8, -.px-8 { - padding-right: 5rem !important; -} - -.pb-8, -.py-8 { - padding-bottom: 5rem !important; -} - -.pl-8, -.px-8 { - padding-left: 5rem !important; -} - -.m-n1 { - margin: -0.25rem !important; -} - -.mt-n1, -.my-n1 { - margin-top: -0.25rem !important; -} - -.mr-n1, -.mx-n1 { - margin-right: -0.25rem !important; -} - -.mb-n1, -.my-n1 { - margin-bottom: -0.25rem !important; -} - -.ml-n1, -.mx-n1 { - margin-left: -0.25rem !important; -} - -.m-n2 { - margin: -0.5rem !important; -} - -.mt-n2, -.my-n2 { - margin-top: -0.5rem !important; -} - -.mr-n2, -.mx-n2 { - margin-right: -0.5rem !important; -} - -.mb-n2, -.my-n2 { - margin-bottom: -0.5rem !important; -} - -.ml-n2, -.mx-n2 { - margin-left: -0.5rem !important; -} - -.m-n3 { - margin: -1rem !important; -} - -.mt-n3, -.my-n3 { - margin-top: -1rem !important; -} - -.mr-n3, -.mx-n3 { - margin-right: -1rem !important; -} - -.mb-n3, -.my-n3 { - margin-bottom: -1rem !important; -} - -.ml-n3, -.mx-n3 { - margin-left: -1rem !important; -} - -.m-n4 { - margin: -1.5rem !important; -} - -.mt-n4, -.my-n4 { - margin-top: -1.5rem !important; -} - -.mr-n4, -.mx-n4 { - margin-right: -1.5rem !important; -} - -.mb-n4, -.my-n4 { - margin-bottom: -1.5rem !important; -} - -.ml-n4, -.mx-n4 { - margin-left: -1.5rem !important; -} - -.m-n5 { - margin: -3rem !important; -} - -.mt-n5, -.my-n5 { - margin-top: -3rem !important; -} - -.mr-n5, -.mx-n5 { - margin-right: -3rem !important; -} - -.mb-n5, -.my-n5 { - margin-bottom: -3rem !important; -} - -.ml-n5, -.mx-n5 { - margin-left: -3rem !important; -} - -.m-n6 { - margin: -3.75rem !important; -} - -.mt-n6, -.my-n6 { - margin-top: -3.75rem !important; -} - -.mr-n6, -.mx-n6 { - margin-right: -3.75rem !important; -} - -.mb-n6, -.my-n6 { - margin-bottom: -3.75rem !important; -} - -.ml-n6, -.mx-n6 { - margin-left: -3.75rem !important; -} - -.m-n7 { - margin: -4.5rem !important; -} - -.mt-n7, -.my-n7 { - margin-top: -4.5rem !important; -} - -.mr-n7, -.mx-n7 { - margin-right: -4.5rem !important; -} - -.mb-n7, -.my-n7 { - margin-bottom: -4.5rem !important; -} - -.ml-n7, -.mx-n7 { - margin-left: -4.5rem !important; -} - -.m-n8 { - margin: -5rem !important; -} - -.mt-n8, -.my-n8 { - margin-top: -5rem !important; -} - -.mr-n8, -.mx-n8 { - margin-right: -5rem !important; -} - -.mb-n8, -.my-n8 { - margin-bottom: -5rem !important; -} - -.ml-n8, -.mx-n8 { - margin-left: -5rem !important; -} - -.m-auto { - margin: auto !important; -} - -.mt-auto, -.my-auto { - margin-top: auto !important; -} - -.mr-auto, -.mx-auto { - margin-right: auto !important; -} - -.mb-auto, -.my-auto { - margin-bottom: auto !important; -} - -.ml-auto, -.mx-auto { - margin-left: auto !important; -} - -@media (min-width: 576px) { - .m-sm-0 { - margin: 0 !important; - } - - .mt-sm-0, - .my-sm-0 { - margin-top: 0 !important; - } - - .mr-sm-0, - .mx-sm-0 { - margin-right: 0 !important; - } - - .mb-sm-0, - .my-sm-0 { - margin-bottom: 0 !important; - } - - .ml-sm-0, - .mx-sm-0 { - margin-left: 0 !important; - } - - .m-sm-1 { - margin: 0.25rem !important; - } - - .mt-sm-1, - .my-sm-1 { - margin-top: 0.25rem !important; - } - - .mr-sm-1, - .mx-sm-1 { - margin-right: 0.25rem !important; - } - - .mb-sm-1, - .my-sm-1 { - margin-bottom: 0.25rem !important; - } - - .ml-sm-1, - .mx-sm-1 { - margin-left: 0.25rem !important; - } - - .m-sm-2 { - margin: 0.5rem !important; - } - - .mt-sm-2, - .my-sm-2 { - margin-top: 0.5rem !important; - } - - .mr-sm-2, - .mx-sm-2 { - margin-right: 0.5rem !important; - } - - .mb-sm-2, - .my-sm-2 { - margin-bottom: 0.5rem !important; - } - - .ml-sm-2, - .mx-sm-2 { - margin-left: 0.5rem !important; - } - - .m-sm-3 { - margin: 1rem !important; - } - - .mt-sm-3, - .my-sm-3 { - margin-top: 1rem !important; - } - - .mr-sm-3, - .mx-sm-3 { - margin-right: 1rem !important; - } - - .mb-sm-3, - .my-sm-3 { - margin-bottom: 1rem !important; - } - - .ml-sm-3, - .mx-sm-3 { - margin-left: 1rem !important; - } - - .m-sm-4 { - margin: 1.5rem !important; - } - - .mt-sm-4, - .my-sm-4 { - margin-top: 1.5rem !important; - } - - .mr-sm-4, - .mx-sm-4 { - margin-right: 1.5rem !important; - } - - .mb-sm-4, - .my-sm-4 { - margin-bottom: 1.5rem !important; - } - - .ml-sm-4, - .mx-sm-4 { - margin-left: 1.5rem !important; - } - - .m-sm-5 { - margin: 3rem !important; - } - - .mt-sm-5, - .my-sm-5 { - margin-top: 3rem !important; - } - - .mr-sm-5, - .mx-sm-5 { - margin-right: 3rem !important; - } - - .mb-sm-5, - .my-sm-5 { - margin-bottom: 3rem !important; - } - - .ml-sm-5, - .mx-sm-5 { - margin-left: 3rem !important; - } - - .m-sm-6 { - margin: 3.75rem !important; - } - - .mt-sm-6, - .my-sm-6 { - margin-top: 3.75rem !important; - } - - .mr-sm-6, - .mx-sm-6 { - margin-right: 3.75rem !important; - } - - .mb-sm-6, - .my-sm-6 { - margin-bottom: 3.75rem !important; - } - - .ml-sm-6, - .mx-sm-6 { - margin-left: 3.75rem !important; - } - - .m-sm-7 { - margin: 4.5rem !important; - } - - .mt-sm-7, - .my-sm-7 { - margin-top: 4.5rem !important; - } - - .mr-sm-7, - .mx-sm-7 { - margin-right: 4.5rem !important; - } - - .mb-sm-7, - .my-sm-7 { - margin-bottom: 4.5rem !important; - } - - .ml-sm-7, - .mx-sm-7 { - margin-left: 4.5rem !important; - } - - .m-sm-8 { - margin: 5rem !important; - } - - .mt-sm-8, - .my-sm-8 { - margin-top: 5rem !important; - } - - .mr-sm-8, - .mx-sm-8 { - margin-right: 5rem !important; - } - - .mb-sm-8, - .my-sm-8 { - margin-bottom: 5rem !important; - } - - .ml-sm-8, - .mx-sm-8 { - margin-left: 5rem !important; - } - - .p-sm-0 { - padding: 0 !important; - } - - .pt-sm-0, - .py-sm-0 { - padding-top: 0 !important; - } - - .pr-sm-0, - .px-sm-0 { - padding-right: 0 !important; - } - - .pb-sm-0, - .py-sm-0 { - padding-bottom: 0 !important; - } - - .pl-sm-0, - .px-sm-0 { - padding-left: 0 !important; - } - - .p-sm-1 { - padding: 0.25rem !important; - } - - .pt-sm-1, - .py-sm-1 { - padding-top: 0.25rem !important; - } - - .pr-sm-1, - .px-sm-1 { - padding-right: 0.25rem !important; - } - - .pb-sm-1, - .py-sm-1 { - padding-bottom: 0.25rem !important; - } - - .pl-sm-1, - .px-sm-1 { - padding-left: 0.25rem !important; - } - - .p-sm-2 { - padding: 0.5rem !important; - } - - .pt-sm-2, - .py-sm-2 { - padding-top: 0.5rem !important; - } - - .pr-sm-2, - .px-sm-2 { - padding-right: 0.5rem !important; - } - - .pb-sm-2, - .py-sm-2 { - padding-bottom: 0.5rem !important; - } - - .pl-sm-2, - .px-sm-2 { - padding-left: 0.5rem !important; - } - - .p-sm-3 { - padding: 1rem !important; - } - - .pt-sm-3, - .py-sm-3 { - padding-top: 1rem !important; - } - - .pr-sm-3, - .px-sm-3 { - padding-right: 1rem !important; - } - - .pb-sm-3, - .py-sm-3 { - padding-bottom: 1rem !important; - } - - .pl-sm-3, - .px-sm-3 { - padding-left: 1rem !important; - } - - .p-sm-4 { - padding: 1.5rem !important; - } - - .pt-sm-4, - .py-sm-4 { - padding-top: 1.5rem !important; - } - - .pr-sm-4, - .px-sm-4 { - padding-right: 1.5rem !important; - } - - .pb-sm-4, - .py-sm-4 { - padding-bottom: 1.5rem !important; - } - - .pl-sm-4, - .px-sm-4 { - padding-left: 1.5rem !important; - } - - .p-sm-5 { - padding: 3rem !important; - } - - .pt-sm-5, - .py-sm-5 { - padding-top: 3rem !important; - } - - .pr-sm-5, - .px-sm-5 { - padding-right: 3rem !important; - } - - .pb-sm-5, - .py-sm-5 { - padding-bottom: 3rem !important; - } - - .pl-sm-5, - .px-sm-5 { - padding-left: 3rem !important; - } - - .p-sm-6 { - padding: 3.75rem !important; - } - - .pt-sm-6, - .py-sm-6 { - padding-top: 3.75rem !important; - } - - .pr-sm-6, - .px-sm-6 { - padding-right: 3.75rem !important; - } - - .pb-sm-6, - .py-sm-6 { - padding-bottom: 3.75rem !important; - } - - .pl-sm-6, - .px-sm-6 { - padding-left: 3.75rem !important; - } - - .p-sm-7 { - padding: 4.5rem !important; - } - - .pt-sm-7, - .py-sm-7 { - padding-top: 4.5rem !important; - } - - .pr-sm-7, - .px-sm-7 { - padding-right: 4.5rem !important; - } - - .pb-sm-7, - .py-sm-7 { - padding-bottom: 4.5rem !important; - } - - .pl-sm-7, - .px-sm-7 { - padding-left: 4.5rem !important; - } - - .p-sm-8 { - padding: 5rem !important; - } - - .pt-sm-8, - .py-sm-8 { - padding-top: 5rem !important; - } - - .pr-sm-8, - .px-sm-8 { - padding-right: 5rem !important; - } - - .pb-sm-8, - .py-sm-8 { - padding-bottom: 5rem !important; - } - - .pl-sm-8, - .px-sm-8 { - padding-left: 5rem !important; - } - - .m-sm-n1 { - margin: -0.25rem !important; - } - - .mt-sm-n1, - .my-sm-n1 { - margin-top: -0.25rem !important; - } - - .mr-sm-n1, - .mx-sm-n1 { - margin-right: -0.25rem !important; - } - - .mb-sm-n1, - .my-sm-n1 { - margin-bottom: -0.25rem !important; - } - - .ml-sm-n1, - .mx-sm-n1 { - margin-left: -0.25rem !important; - } - - .m-sm-n2 { - margin: -0.5rem !important; - } - - .mt-sm-n2, - .my-sm-n2 { - margin-top: -0.5rem !important; - } - - .mr-sm-n2, - .mx-sm-n2 { - margin-right: -0.5rem !important; - } - - .mb-sm-n2, - .my-sm-n2 { - margin-bottom: -0.5rem !important; - } - - .ml-sm-n2, - .mx-sm-n2 { - margin-left: -0.5rem !important; - } - - .m-sm-n3 { - margin: -1rem !important; - } - - .mt-sm-n3, - .my-sm-n3 { - margin-top: -1rem !important; - } - - .mr-sm-n3, - .mx-sm-n3 { - margin-right: -1rem !important; - } - - .mb-sm-n3, - .my-sm-n3 { - margin-bottom: -1rem !important; - } - - .ml-sm-n3, - .mx-sm-n3 { - margin-left: -1rem !important; - } - - .m-sm-n4 { - margin: -1.5rem !important; - } - - .mt-sm-n4, - .my-sm-n4 { - margin-top: -1.5rem !important; - } - - .mr-sm-n4, - .mx-sm-n4 { - margin-right: -1.5rem !important; - } - - .mb-sm-n4, - .my-sm-n4 { - margin-bottom: -1.5rem !important; - } - - .ml-sm-n4, - .mx-sm-n4 { - margin-left: -1.5rem !important; - } - - .m-sm-n5 { - margin: -3rem !important; - } - - .mt-sm-n5, - .my-sm-n5 { - margin-top: -3rem !important; - } - - .mr-sm-n5, - .mx-sm-n5 { - margin-right: -3rem !important; - } - - .mb-sm-n5, - .my-sm-n5 { - margin-bottom: -3rem !important; - } - - .ml-sm-n5, - .mx-sm-n5 { - margin-left: -3rem !important; - } - - .m-sm-n6 { - margin: -3.75rem !important; - } - - .mt-sm-n6, - .my-sm-n6 { - margin-top: -3.75rem !important; - } - - .mr-sm-n6, - .mx-sm-n6 { - margin-right: -3.75rem !important; - } - - .mb-sm-n6, - .my-sm-n6 { - margin-bottom: -3.75rem !important; - } - - .ml-sm-n6, - .mx-sm-n6 { - margin-left: -3.75rem !important; - } - - .m-sm-n7 { - margin: -4.5rem !important; - } - - .mt-sm-n7, - .my-sm-n7 { - margin-top: -4.5rem !important; - } - - .mr-sm-n7, - .mx-sm-n7 { - margin-right: -4.5rem !important; - } - - .mb-sm-n7, - .my-sm-n7 { - margin-bottom: -4.5rem !important; - } - - .ml-sm-n7, - .mx-sm-n7 { - margin-left: -4.5rem !important; - } - - .m-sm-n8 { - margin: -5rem !important; - } - - .mt-sm-n8, - .my-sm-n8 { - margin-top: -5rem !important; - } - - .mr-sm-n8, - .mx-sm-n8 { - margin-right: -5rem !important; - } - - .mb-sm-n8, - .my-sm-n8 { - margin-bottom: -5rem !important; - } - - .ml-sm-n8, - .mx-sm-n8 { - margin-left: -5rem !important; - } - - .m-sm-auto { - margin: auto !important; - } - - .mt-sm-auto, - .my-sm-auto { - margin-top: auto !important; - } - - .mr-sm-auto, - .mx-sm-auto { - margin-right: auto !important; - } - - .mb-sm-auto, - .my-sm-auto { - margin-bottom: auto !important; - } - - .ml-sm-auto, - .mx-sm-auto { - margin-left: auto !important; - } -} - -@media (min-width: 768px) { - .m-md-0 { - margin: 0 !important; - } - - .mt-md-0, - .my-md-0 { - margin-top: 0 !important; - } - - .mr-md-0, - .mx-md-0 { - margin-right: 0 !important; - } - - .mb-md-0, - .my-md-0 { - margin-bottom: 0 !important; - } - - .ml-md-0, - .mx-md-0 { - margin-left: 0 !important; - } - - .m-md-1 { - margin: 0.25rem !important; - } - - .mt-md-1, - .my-md-1 { - margin-top: 0.25rem !important; - } - - .mr-md-1, - .mx-md-1 { - margin-right: 0.25rem !important; - } - - .mb-md-1, - .my-md-1 { - margin-bottom: 0.25rem !important; - } - - .ml-md-1, - .mx-md-1 { - margin-left: 0.25rem !important; - } - - .m-md-2 { - margin: 0.5rem !important; - } - - .mt-md-2, - .my-md-2 { - margin-top: 0.5rem !important; - } - - .mr-md-2, - .mx-md-2 { - margin-right: 0.5rem !important; - } - - .mb-md-2, - .my-md-2 { - margin-bottom: 0.5rem !important; - } - - .ml-md-2, - .mx-md-2 { - margin-left: 0.5rem !important; - } - - .m-md-3 { - margin: 1rem !important; - } - - .mt-md-3, - .my-md-3 { - margin-top: 1rem !important; - } - - .mr-md-3, - .mx-md-3 { - margin-right: 1rem !important; - } - - .mb-md-3, - .my-md-3 { - margin-bottom: 1rem !important; - } - - .ml-md-3, - .mx-md-3 { - margin-left: 1rem !important; - } - - .m-md-4 { - margin: 1.5rem !important; - } - - .mt-md-4, - .my-md-4 { - margin-top: 1.5rem !important; - } - - .mr-md-4, - .mx-md-4 { - margin-right: 1.5rem !important; - } - - .mb-md-4, - .my-md-4 { - margin-bottom: 1.5rem !important; - } - - .ml-md-4, - .mx-md-4 { - margin-left: 1.5rem !important; - } - - .m-md-5 { - margin: 3rem !important; - } - - .mt-md-5, - .my-md-5 { - margin-top: 3rem !important; - } - - .mr-md-5, - .mx-md-5 { - margin-right: 3rem !important; - } - - .mb-md-5, - .my-md-5 { - margin-bottom: 3rem !important; - } - - .ml-md-5, - .mx-md-5 { - margin-left: 3rem !important; - } - - .m-md-6 { - margin: 3.75rem !important; - } - - .mt-md-6, - .my-md-6 { - margin-top: 3.75rem !important; - } - - .mr-md-6, - .mx-md-6 { - margin-right: 3.75rem !important; - } - - .mb-md-6, - .my-md-6 { - margin-bottom: 3.75rem !important; - } - - .ml-md-6, - .mx-md-6 { - margin-left: 3.75rem !important; - } - - .m-md-7 { - margin: 4.5rem !important; - } - - .mt-md-7, - .my-md-7 { - margin-top: 4.5rem !important; - } - - .mr-md-7, - .mx-md-7 { - margin-right: 4.5rem !important; - } - - .mb-md-7, - .my-md-7 { - margin-bottom: 4.5rem !important; - } - - .ml-md-7, - .mx-md-7 { - margin-left: 4.5rem !important; - } - - .m-md-8 { - margin: 5rem !important; - } - - .mt-md-8, - .my-md-8 { - margin-top: 5rem !important; - } - - .mr-md-8, - .mx-md-8 { - margin-right: 5rem !important; - } - - .mb-md-8, - .my-md-8 { - margin-bottom: 5rem !important; - } - - .ml-md-8, - .mx-md-8 { - margin-left: 5rem !important; - } - - .p-md-0 { - padding: 0 !important; - } - - .pt-md-0, - .py-md-0 { - padding-top: 0 !important; - } - - .pr-md-0, - .px-md-0 { - padding-right: 0 !important; - } - - .pb-md-0, - .py-md-0 { - padding-bottom: 0 !important; - } - - .pl-md-0, - .px-md-0 { - padding-left: 0 !important; - } - - .p-md-1 { - padding: 0.25rem !important; - } - - .pt-md-1, - .py-md-1 { - padding-top: 0.25rem !important; - } - - .pr-md-1, - .px-md-1 { - padding-right: 0.25rem !important; - } - - .pb-md-1, - .py-md-1 { - padding-bottom: 0.25rem !important; - } - - .pl-md-1, - .px-md-1 { - padding-left: 0.25rem !important; - } - - .p-md-2 { - padding: 0.5rem !important; - } - - .pt-md-2, - .py-md-2 { - padding-top: 0.5rem !important; - } - - .pr-md-2, - .px-md-2 { - padding-right: 0.5rem !important; - } - - .pb-md-2, - .py-md-2 { - padding-bottom: 0.5rem !important; - } - - .pl-md-2, - .px-md-2 { - padding-left: 0.5rem !important; - } - - .p-md-3 { - padding: 1rem !important; - } - - .pt-md-3, - .py-md-3 { - padding-top: 1rem !important; - } - - .pr-md-3, - .px-md-3 { - padding-right: 1rem !important; - } - - .pb-md-3, - .py-md-3 { - padding-bottom: 1rem !important; - } - - .pl-md-3, - .px-md-3 { - padding-left: 1rem !important; - } - - .p-md-4 { - padding: 1.5rem !important; - } - - .pt-md-4, - .py-md-4 { - padding-top: 1.5rem !important; - } - - .pr-md-4, - .px-md-4 { - padding-right: 1.5rem !important; - } - - .pb-md-4, - .py-md-4 { - padding-bottom: 1.5rem !important; - } - - .pl-md-4, - .px-md-4 { - padding-left: 1.5rem !important; - } - - .p-md-5 { - padding: 3rem !important; - } - - .pt-md-5, - .py-md-5 { - padding-top: 3rem !important; - } - - .pr-md-5, - .px-md-5 { - padding-right: 3rem !important; - } - - .pb-md-5, - .py-md-5 { - padding-bottom: 3rem !important; - } - - .pl-md-5, - .px-md-5 { - padding-left: 3rem !important; - } - - .p-md-6 { - padding: 3.75rem !important; - } - - .pt-md-6, - .py-md-6 { - padding-top: 3.75rem !important; - } - - .pr-md-6, - .px-md-6 { - padding-right: 3.75rem !important; - } - - .pb-md-6, - .py-md-6 { - padding-bottom: 3.75rem !important; - } - - .pl-md-6, - .px-md-6 { - padding-left: 3.75rem !important; - } - - .p-md-7 { - padding: 4.5rem !important; - } - - .pt-md-7, - .py-md-7 { - padding-top: 4.5rem !important; - } - - .pr-md-7, - .px-md-7 { - padding-right: 4.5rem !important; - } - - .pb-md-7, - .py-md-7 { - padding-bottom: 4.5rem !important; - } - - .pl-md-7, - .px-md-7 { - padding-left: 4.5rem !important; - } - - .p-md-8 { - padding: 5rem !important; - } - - .pt-md-8, - .py-md-8 { - padding-top: 5rem !important; - } - - .pr-md-8, - .px-md-8 { - padding-right: 5rem !important; - } - - .pb-md-8, - .py-md-8 { - padding-bottom: 5rem !important; - } - - .pl-md-8, - .px-md-8 { - padding-left: 5rem !important; - } - - .m-md-n1 { - margin: -0.25rem !important; - } - - .mt-md-n1, - .my-md-n1 { - margin-top: -0.25rem !important; - } - - .mr-md-n1, - .mx-md-n1 { - margin-right: -0.25rem !important; - } - - .mb-md-n1, - .my-md-n1 { - margin-bottom: -0.25rem !important; - } - - .ml-md-n1, - .mx-md-n1 { - margin-left: -0.25rem !important; - } - - .m-md-n2 { - margin: -0.5rem !important; - } - - .mt-md-n2, - .my-md-n2 { - margin-top: -0.5rem !important; - } - - .mr-md-n2, - .mx-md-n2 { - margin-right: -0.5rem !important; - } - - .mb-md-n2, - .my-md-n2 { - margin-bottom: -0.5rem !important; - } - - .ml-md-n2, - .mx-md-n2 { - margin-left: -0.5rem !important; - } - - .m-md-n3 { - margin: -1rem !important; - } - - .mt-md-n3, - .my-md-n3 { - margin-top: -1rem !important; - } - - .mr-md-n3, - .mx-md-n3 { - margin-right: -1rem !important; - } - - .mb-md-n3, - .my-md-n3 { - margin-bottom: -1rem !important; - } - - .ml-md-n3, - .mx-md-n3 { - margin-left: -1rem !important; - } - - .m-md-n4 { - margin: -1.5rem !important; - } - - .mt-md-n4, - .my-md-n4 { - margin-top: -1.5rem !important; - } - - .mr-md-n4, - .mx-md-n4 { - margin-right: -1.5rem !important; - } - - .mb-md-n4, - .my-md-n4 { - margin-bottom: -1.5rem !important; - } - - .ml-md-n4, - .mx-md-n4 { - margin-left: -1.5rem !important; - } - - .m-md-n5 { - margin: -3rem !important; - } - - .mt-md-n5, - .my-md-n5 { - margin-top: -3rem !important; - } - - .mr-md-n5, - .mx-md-n5 { - margin-right: -3rem !important; - } - - .mb-md-n5, - .my-md-n5 { - margin-bottom: -3rem !important; - } - - .ml-md-n5, - .mx-md-n5 { - margin-left: -3rem !important; - } - - .m-md-n6 { - margin: -3.75rem !important; - } - - .mt-md-n6, - .my-md-n6 { - margin-top: -3.75rem !important; - } - - .mr-md-n6, - .mx-md-n6 { - margin-right: -3.75rem !important; - } - - .mb-md-n6, - .my-md-n6 { - margin-bottom: -3.75rem !important; - } - - .ml-md-n6, - .mx-md-n6 { - margin-left: -3.75rem !important; - } - - .m-md-n7 { - margin: -4.5rem !important; - } - - .mt-md-n7, - .my-md-n7 { - margin-top: -4.5rem !important; - } - - .mr-md-n7, - .mx-md-n7 { - margin-right: -4.5rem !important; - } - - .mb-md-n7, - .my-md-n7 { - margin-bottom: -4.5rem !important; - } - - .ml-md-n7, - .mx-md-n7 { - margin-left: -4.5rem !important; - } - - .m-md-n8 { - margin: -5rem !important; - } - - .mt-md-n8, - .my-md-n8 { - margin-top: -5rem !important; - } - - .mr-md-n8, - .mx-md-n8 { - margin-right: -5rem !important; - } - - .mb-md-n8, - .my-md-n8 { - margin-bottom: -5rem !important; - } - - .ml-md-n8, - .mx-md-n8 { - margin-left: -5rem !important; - } - - .m-md-auto { - margin: auto !important; - } - - .mt-md-auto, - .my-md-auto { - margin-top: auto !important; - } - - .mr-md-auto, - .mx-md-auto { - margin-right: auto !important; - } - - .mb-md-auto, - .my-md-auto { - margin-bottom: auto !important; - } - - .ml-md-auto, - .mx-md-auto { - margin-left: auto !important; - } -} - -@media (min-width: 992px) { - .m-lg-0 { - margin: 0 !important; - } - - .mt-lg-0, - .my-lg-0 { - margin-top: 0 !important; - } - - .mr-lg-0, - .mx-lg-0 { - margin-right: 0 !important; - } - - .mb-lg-0, - .my-lg-0 { - margin-bottom: 0 !important; - } - - .ml-lg-0, - .mx-lg-0 { - margin-left: 0 !important; - } - - .m-lg-1 { - margin: 0.25rem !important; - } - - .mt-lg-1, - .my-lg-1 { - margin-top: 0.25rem !important; - } - - .mr-lg-1, - .mx-lg-1 { - margin-right: 0.25rem !important; - } - - .mb-lg-1, - .my-lg-1 { - margin-bottom: 0.25rem !important; - } - - .ml-lg-1, - .mx-lg-1 { - margin-left: 0.25rem !important; - } - - .m-lg-2 { - margin: 0.5rem !important; - } - - .mt-lg-2, - .my-lg-2 { - margin-top: 0.5rem !important; - } - - .mr-lg-2, - .mx-lg-2 { - margin-right: 0.5rem !important; - } - - .mb-lg-2, - .my-lg-2 { - margin-bottom: 0.5rem !important; - } - - .ml-lg-2, - .mx-lg-2 { - margin-left: 0.5rem !important; - } - - .m-lg-3 { - margin: 1rem !important; - } - - .mt-lg-3, - .my-lg-3 { - margin-top: 1rem !important; - } - - .mr-lg-3, - .mx-lg-3 { - margin-right: 1rem !important; - } - - .mb-lg-3, - .my-lg-3 { - margin-bottom: 1rem !important; - } - - .ml-lg-3, - .mx-lg-3 { - margin-left: 1rem !important; - } - - .m-lg-4 { - margin: 1.5rem !important; - } - - .mt-lg-4, - .my-lg-4 { - margin-top: 1.5rem !important; - } - - .mr-lg-4, - .mx-lg-4 { - margin-right: 1.5rem !important; - } - - .mb-lg-4, - .my-lg-4 { - margin-bottom: 1.5rem !important; - } - - .ml-lg-4, - .mx-lg-4 { - margin-left: 1.5rem !important; - } - - .m-lg-5 { - margin: 3rem !important; - } - - .mt-lg-5, - .my-lg-5 { - margin-top: 3rem !important; - } - - .mr-lg-5, - .mx-lg-5 { - margin-right: 3rem !important; - } - - .mb-lg-5, - .my-lg-5 { - margin-bottom: 3rem !important; - } - - .ml-lg-5, - .mx-lg-5 { - margin-left: 3rem !important; - } - - .m-lg-6 { - margin: 3.75rem !important; - } - - .mt-lg-6, - .my-lg-6 { - margin-top: 3.75rem !important; - } - - .mr-lg-6, - .mx-lg-6 { - margin-right: 3.75rem !important; - } - - .mb-lg-6, - .my-lg-6 { - margin-bottom: 3.75rem !important; - } - - .ml-lg-6, - .mx-lg-6 { - margin-left: 3.75rem !important; - } - - .m-lg-7 { - margin: 4.5rem !important; - } - - .mt-lg-7, - .my-lg-7 { - margin-top: 4.5rem !important; - } - - .mr-lg-7, - .mx-lg-7 { - margin-right: 4.5rem !important; - } - - .mb-lg-7, - .my-lg-7 { - margin-bottom: 4.5rem !important; - } - - .ml-lg-7, - .mx-lg-7 { - margin-left: 4.5rem !important; - } - - .m-lg-8 { - margin: 5rem !important; - } - - .mt-lg-8, - .my-lg-8 { - margin-top: 5rem !important; - } - - .mr-lg-8, - .mx-lg-8 { - margin-right: 5rem !important; - } - - .mb-lg-8, - .my-lg-8 { - margin-bottom: 5rem !important; - } - - .ml-lg-8, - .mx-lg-8 { - margin-left: 5rem !important; - } - - .p-lg-0 { - padding: 0 !important; - } - - .pt-lg-0, - .py-lg-0 { - padding-top: 0 !important; - } - - .pr-lg-0, - .px-lg-0 { - padding-right: 0 !important; - } - - .pb-lg-0, - .py-lg-0 { - padding-bottom: 0 !important; - } - - .pl-lg-0, - .px-lg-0 { - padding-left: 0 !important; - } - - .p-lg-1 { - padding: 0.25rem !important; - } - - .pt-lg-1, - .py-lg-1 { - padding-top: 0.25rem !important; - } - - .pr-lg-1, - .px-lg-1 { - padding-right: 0.25rem !important; - } - - .pb-lg-1, - .py-lg-1 { - padding-bottom: 0.25rem !important; - } - - .pl-lg-1, - .px-lg-1 { - padding-left: 0.25rem !important; - } - - .p-lg-2 { - padding: 0.5rem !important; - } - - .pt-lg-2, - .py-lg-2 { - padding-top: 0.5rem !important; - } - - .pr-lg-2, - .px-lg-2 { - padding-right: 0.5rem !important; - } - - .pb-lg-2, - .py-lg-2 { - padding-bottom: 0.5rem !important; - } - - .pl-lg-2, - .px-lg-2 { - padding-left: 0.5rem !important; - } - - .p-lg-3 { - padding: 1rem !important; - } - - .pt-lg-3, - .py-lg-3 { - padding-top: 1rem !important; - } - - .pr-lg-3, - .px-lg-3 { - padding-right: 1rem !important; - } - - .pb-lg-3, - .py-lg-3 { - padding-bottom: 1rem !important; - } - - .pl-lg-3, - .px-lg-3 { - padding-left: 1rem !important; - } - - .p-lg-4 { - padding: 1.5rem !important; - } - - .pt-lg-4, - .py-lg-4 { - padding-top: 1.5rem !important; - } - - .pr-lg-4, - .px-lg-4 { - padding-right: 1.5rem !important; - } - - .pb-lg-4, - .py-lg-4 { - padding-bottom: 1.5rem !important; - } - - .pl-lg-4, - .px-lg-4 { - padding-left: 1.5rem !important; - } - - .p-lg-5 { - padding: 3rem !important; - } - - .pt-lg-5, - .py-lg-5 { - padding-top: 3rem !important; - } - - .pr-lg-5, - .px-lg-5 { - padding-right: 3rem !important; - } - - .pb-lg-5, - .py-lg-5 { - padding-bottom: 3rem !important; - } - - .pl-lg-5, - .px-lg-5 { - padding-left: 3rem !important; - } - - .p-lg-6 { - padding: 3.75rem !important; - } - - .pt-lg-6, - .py-lg-6 { - padding-top: 3.75rem !important; - } - - .pr-lg-6, - .px-lg-6 { - padding-right: 3.75rem !important; - } - - .pb-lg-6, - .py-lg-6 { - padding-bottom: 3.75rem !important; - } - - .pl-lg-6, - .px-lg-6 { - padding-left: 3.75rem !important; - } - - .p-lg-7 { - padding: 4.5rem !important; - } - - .pt-lg-7, - .py-lg-7 { - padding-top: 4.5rem !important; - } - - .pr-lg-7, - .px-lg-7 { - padding-right: 4.5rem !important; - } - - .pb-lg-7, - .py-lg-7 { - padding-bottom: 4.5rem !important; - } - - .pl-lg-7, - .px-lg-7 { - padding-left: 4.5rem !important; - } - - .p-lg-8 { - padding: 5rem !important; - } - - .pt-lg-8, - .py-lg-8 { - padding-top: 5rem !important; - } - - .pr-lg-8, - .px-lg-8 { - padding-right: 5rem !important; - } - - .pb-lg-8, - .py-lg-8 { - padding-bottom: 5rem !important; - } - - .pl-lg-8, - .px-lg-8 { - padding-left: 5rem !important; - } - - .m-lg-n1 { - margin: -0.25rem !important; - } - - .mt-lg-n1, - .my-lg-n1 { - margin-top: -0.25rem !important; - } - - .mr-lg-n1, - .mx-lg-n1 { - margin-right: -0.25rem !important; - } - - .mb-lg-n1, - .my-lg-n1 { - margin-bottom: -0.25rem !important; - } - - .ml-lg-n1, - .mx-lg-n1 { - margin-left: -0.25rem !important; - } - - .m-lg-n2 { - margin: -0.5rem !important; - } - - .mt-lg-n2, - .my-lg-n2 { - margin-top: -0.5rem !important; - } - - .mr-lg-n2, - .mx-lg-n2 { - margin-right: -0.5rem !important; - } - - .mb-lg-n2, - .my-lg-n2 { - margin-bottom: -0.5rem !important; - } - - .ml-lg-n2, - .mx-lg-n2 { - margin-left: -0.5rem !important; - } - - .m-lg-n3 { - margin: -1rem !important; - } - - .mt-lg-n3, - .my-lg-n3 { - margin-top: -1rem !important; - } - - .mr-lg-n3, - .mx-lg-n3 { - margin-right: -1rem !important; - } - - .mb-lg-n3, - .my-lg-n3 { - margin-bottom: -1rem !important; - } - - .ml-lg-n3, - .mx-lg-n3 { - margin-left: -1rem !important; - } - - .m-lg-n4 { - margin: -1.5rem !important; - } - - .mt-lg-n4, - .my-lg-n4 { - margin-top: -1.5rem !important; - } - - .mr-lg-n4, - .mx-lg-n4 { - margin-right: -1.5rem !important; - } - - .mb-lg-n4, - .my-lg-n4 { - margin-bottom: -1.5rem !important; - } - - .ml-lg-n4, - .mx-lg-n4 { - margin-left: -1.5rem !important; - } - - .m-lg-n5 { - margin: -3rem !important; - } - - .mt-lg-n5, - .my-lg-n5 { - margin-top: -3rem !important; - } - - .mr-lg-n5, - .mx-lg-n5 { - margin-right: -3rem !important; - } - - .mb-lg-n5, - .my-lg-n5 { - margin-bottom: -3rem !important; - } - - .ml-lg-n5, - .mx-lg-n5 { - margin-left: -3rem !important; - } - - .m-lg-n6 { - margin: -3.75rem !important; - } - - .mt-lg-n6, - .my-lg-n6 { - margin-top: -3.75rem !important; - } - - .mr-lg-n6, - .mx-lg-n6 { - margin-right: -3.75rem !important; - } - - .mb-lg-n6, - .my-lg-n6 { - margin-bottom: -3.75rem !important; - } - - .ml-lg-n6, - .mx-lg-n6 { - margin-left: -3.75rem !important; - } - - .m-lg-n7 { - margin: -4.5rem !important; - } - - .mt-lg-n7, - .my-lg-n7 { - margin-top: -4.5rem !important; - } - - .mr-lg-n7, - .mx-lg-n7 { - margin-right: -4.5rem !important; - } - - .mb-lg-n7, - .my-lg-n7 { - margin-bottom: -4.5rem !important; - } - - .ml-lg-n7, - .mx-lg-n7 { - margin-left: -4.5rem !important; - } - - .m-lg-n8 { - margin: -5rem !important; - } - - .mt-lg-n8, - .my-lg-n8 { - margin-top: -5rem !important; - } - - .mr-lg-n8, - .mx-lg-n8 { - margin-right: -5rem !important; - } - - .mb-lg-n8, - .my-lg-n8 { - margin-bottom: -5rem !important; - } - - .ml-lg-n8, - .mx-lg-n8 { - margin-left: -5rem !important; - } - - .m-lg-auto { - margin: auto !important; - } - - .mt-lg-auto, - .my-lg-auto { - margin-top: auto !important; - } - - .mr-lg-auto, - .mx-lg-auto { - margin-right: auto !important; - } - - .mb-lg-auto, - .my-lg-auto { - margin-bottom: auto !important; - } - - .ml-lg-auto, - .mx-lg-auto { - margin-left: auto !important; - } -} - -@media (min-width: 1200px) { - .m-xl-0 { - margin: 0 !important; - } - - .mt-xl-0, - .my-xl-0 { - margin-top: 0 !important; - } - - .mr-xl-0, - .mx-xl-0 { - margin-right: 0 !important; - } - - .mb-xl-0, - .my-xl-0 { - margin-bottom: 0 !important; - } - - .ml-xl-0, - .mx-xl-0 { - margin-left: 0 !important; - } - - .m-xl-1 { - margin: 0.25rem !important; - } - - .mt-xl-1, - .my-xl-1 { - margin-top: 0.25rem !important; - } - - .mr-xl-1, - .mx-xl-1 { - margin-right: 0.25rem !important; - } - - .mb-xl-1, - .my-xl-1 { - margin-bottom: 0.25rem !important; - } - - .ml-xl-1, - .mx-xl-1 { - margin-left: 0.25rem !important; - } - - .m-xl-2 { - margin: 0.5rem !important; - } - - .mt-xl-2, - .my-xl-2 { - margin-top: 0.5rem !important; - } - - .mr-xl-2, - .mx-xl-2 { - margin-right: 0.5rem !important; - } - - .mb-xl-2, - .my-xl-2 { - margin-bottom: 0.5rem !important; - } - - .ml-xl-2, - .mx-xl-2 { - margin-left: 0.5rem !important; - } - - .m-xl-3 { - margin: 1rem !important; - } - - .mt-xl-3, - .my-xl-3 { - margin-top: 1rem !important; - } - - .mr-xl-3, - .mx-xl-3 { - margin-right: 1rem !important; - } - - .mb-xl-3, - .my-xl-3 { - margin-bottom: 1rem !important; - } - - .ml-xl-3, - .mx-xl-3 { - margin-left: 1rem !important; - } - - .m-xl-4 { - margin: 1.5rem !important; - } - - .mt-xl-4, - .my-xl-4 { - margin-top: 1.5rem !important; - } - - .mr-xl-4, - .mx-xl-4 { - margin-right: 1.5rem !important; - } - - .mb-xl-4, - .my-xl-4 { - margin-bottom: 1.5rem !important; - } - - .ml-xl-4, - .mx-xl-4 { - margin-left: 1.5rem !important; - } - - .m-xl-5 { - margin: 3rem !important; - } - - .mt-xl-5, - .my-xl-5 { - margin-top: 3rem !important; - } - - .mr-xl-5, - .mx-xl-5 { - margin-right: 3rem !important; - } - - .mb-xl-5, - .my-xl-5 { - margin-bottom: 3rem !important; - } - - .ml-xl-5, - .mx-xl-5 { - margin-left: 3rem !important; - } - - .m-xl-6 { - margin: 3.75rem !important; - } - - .mt-xl-6, - .my-xl-6 { - margin-top: 3.75rem !important; - } - - .mr-xl-6, - .mx-xl-6 { - margin-right: 3.75rem !important; - } - - .mb-xl-6, - .my-xl-6 { - margin-bottom: 3.75rem !important; - } - - .ml-xl-6, - .mx-xl-6 { - margin-left: 3.75rem !important; - } - - .m-xl-7 { - margin: 4.5rem !important; - } - - .mt-xl-7, - .my-xl-7 { - margin-top: 4.5rem !important; - } - - .mr-xl-7, - .mx-xl-7 { - margin-right: 4.5rem !important; - } - - .mb-xl-7, - .my-xl-7 { - margin-bottom: 4.5rem !important; - } - - .ml-xl-7, - .mx-xl-7 { - margin-left: 4.5rem !important; - } - - .m-xl-8 { - margin: 5rem !important; - } - - .mt-xl-8, - .my-xl-8 { - margin-top: 5rem !important; - } - - .mr-xl-8, - .mx-xl-8 { - margin-right: 5rem !important; - } - - .mb-xl-8, - .my-xl-8 { - margin-bottom: 5rem !important; - } - - .ml-xl-8, - .mx-xl-8 { - margin-left: 5rem !important; - } - - .p-xl-0 { - padding: 0 !important; - } - - .pt-xl-0, - .py-xl-0 { - padding-top: 0 !important; - } - - .pr-xl-0, - .px-xl-0 { - padding-right: 0 !important; - } - - .pb-xl-0, - .py-xl-0 { - padding-bottom: 0 !important; - } - - .pl-xl-0, - .px-xl-0 { - padding-left: 0 !important; - } - - .p-xl-1 { - padding: 0.25rem !important; - } - - .pt-xl-1, - .py-xl-1 { - padding-top: 0.25rem !important; - } - - .pr-xl-1, - .px-xl-1 { - padding-right: 0.25rem !important; - } - - .pb-xl-1, - .py-xl-1 { - padding-bottom: 0.25rem !important; - } - - .pl-xl-1, - .px-xl-1 { - padding-left: 0.25rem !important; - } - - .p-xl-2 { - padding: 0.5rem !important; - } - - .pt-xl-2, - .py-xl-2 { - padding-top: 0.5rem !important; - } - - .pr-xl-2, - .px-xl-2 { - padding-right: 0.5rem !important; - } - - .pb-xl-2, - .py-xl-2 { - padding-bottom: 0.5rem !important; - } - - .pl-xl-2, - .px-xl-2 { - padding-left: 0.5rem !important; - } - - .p-xl-3 { - padding: 1rem !important; - } - - .pt-xl-3, - .py-xl-3 { - padding-top: 1rem !important; - } - - .pr-xl-3, - .px-xl-3 { - padding-right: 1rem !important; - } - - .pb-xl-3, - .py-xl-3 { - padding-bottom: 1rem !important; - } - - .pl-xl-3, - .px-xl-3 { - padding-left: 1rem !important; - } - - .p-xl-4 { - padding: 1.5rem !important; - } - - .pt-xl-4, - .py-xl-4 { - padding-top: 1.5rem !important; - } - - .pr-xl-4, - .px-xl-4 { - padding-right: 1.5rem !important; - } - - .pb-xl-4, - .py-xl-4 { - padding-bottom: 1.5rem !important; - } - - .pl-xl-4, - .px-xl-4 { - padding-left: 1.5rem !important; - } - - .p-xl-5 { - padding: 3rem !important; - } - - .pt-xl-5, - .py-xl-5 { - padding-top: 3rem !important; - } - - .pr-xl-5, - .px-xl-5 { - padding-right: 3rem !important; - } - - .pb-xl-5, - .py-xl-5 { - padding-bottom: 3rem !important; - } - - .pl-xl-5, - .px-xl-5 { - padding-left: 3rem !important; - } - - .p-xl-6 { - padding: 3.75rem !important; - } - - .pt-xl-6, - .py-xl-6 { - padding-top: 3.75rem !important; - } - - .pr-xl-6, - .px-xl-6 { - padding-right: 3.75rem !important; - } - - .pb-xl-6, - .py-xl-6 { - padding-bottom: 3.75rem !important; - } - - .pl-xl-6, - .px-xl-6 { - padding-left: 3.75rem !important; - } - - .p-xl-7 { - padding: 4.5rem !important; - } - - .pt-xl-7, - .py-xl-7 { - padding-top: 4.5rem !important; - } - - .pr-xl-7, - .px-xl-7 { - padding-right: 4.5rem !important; - } - - .pb-xl-7, - .py-xl-7 { - padding-bottom: 4.5rem !important; - } - - .pl-xl-7, - .px-xl-7 { - padding-left: 4.5rem !important; - } - - .p-xl-8 { - padding: 5rem !important; - } - - .pt-xl-8, - .py-xl-8 { - padding-top: 5rem !important; - } - - .pr-xl-8, - .px-xl-8 { - padding-right: 5rem !important; - } - - .pb-xl-8, - .py-xl-8 { - padding-bottom: 5rem !important; - } - - .pl-xl-8, - .px-xl-8 { - padding-left: 5rem !important; - } - - .m-xl-n1 { - margin: -0.25rem !important; - } - - .mt-xl-n1, - .my-xl-n1 { - margin-top: -0.25rem !important; - } - - .mr-xl-n1, - .mx-xl-n1 { - margin-right: -0.25rem !important; - } - - .mb-xl-n1, - .my-xl-n1 { - margin-bottom: -0.25rem !important; - } - - .ml-xl-n1, - .mx-xl-n1 { - margin-left: -0.25rem !important; - } - - .m-xl-n2 { - margin: -0.5rem !important; - } - - .mt-xl-n2, - .my-xl-n2 { - margin-top: -0.5rem !important; - } - - .mr-xl-n2, - .mx-xl-n2 { - margin-right: -0.5rem !important; - } - - .mb-xl-n2, - .my-xl-n2 { - margin-bottom: -0.5rem !important; - } - - .ml-xl-n2, - .mx-xl-n2 { - margin-left: -0.5rem !important; - } - - .m-xl-n3 { - margin: -1rem !important; - } - - .mt-xl-n3, - .my-xl-n3 { - margin-top: -1rem !important; - } - - .mr-xl-n3, - .mx-xl-n3 { - margin-right: -1rem !important; - } - - .mb-xl-n3, - .my-xl-n3 { - margin-bottom: -1rem !important; - } - - .ml-xl-n3, - .mx-xl-n3 { - margin-left: -1rem !important; - } - - .m-xl-n4 { - margin: -1.5rem !important; - } - - .mt-xl-n4, - .my-xl-n4 { - margin-top: -1.5rem !important; - } - - .mr-xl-n4, - .mx-xl-n4 { - margin-right: -1.5rem !important; - } - - .mb-xl-n4, - .my-xl-n4 { - margin-bottom: -1.5rem !important; - } - - .ml-xl-n4, - .mx-xl-n4 { - margin-left: -1.5rem !important; - } - - .m-xl-n5 { - margin: -3rem !important; - } - - .mt-xl-n5, - .my-xl-n5 { - margin-top: -3rem !important; - } - - .mr-xl-n5, - .mx-xl-n5 { - margin-right: -3rem !important; - } - - .mb-xl-n5, - .my-xl-n5 { - margin-bottom: -3rem !important; - } - - .ml-xl-n5, - .mx-xl-n5 { - margin-left: -3rem !important; - } - - .m-xl-n6 { - margin: -3.75rem !important; - } - - .mt-xl-n6, - .my-xl-n6 { - margin-top: -3.75rem !important; - } - - .mr-xl-n6, - .mx-xl-n6 { - margin-right: -3.75rem !important; - } - - .mb-xl-n6, - .my-xl-n6 { - margin-bottom: -3.75rem !important; - } - - .ml-xl-n6, - .mx-xl-n6 { - margin-left: -3.75rem !important; - } - - .m-xl-n7 { - margin: -4.5rem !important; - } - - .mt-xl-n7, - .my-xl-n7 { - margin-top: -4.5rem !important; - } - - .mr-xl-n7, - .mx-xl-n7 { - margin-right: -4.5rem !important; - } - - .mb-xl-n7, - .my-xl-n7 { - margin-bottom: -4.5rem !important; - } - - .ml-xl-n7, - .mx-xl-n7 { - margin-left: -4.5rem !important; - } - - .m-xl-n8 { - margin: -5rem !important; - } - - .mt-xl-n8, - .my-xl-n8 { - margin-top: -5rem !important; - } - - .mr-xl-n8, - .mx-xl-n8 { - margin-right: -5rem !important; - } - - .mb-xl-n8, - .my-xl-n8 { - margin-bottom: -5rem !important; - } - - .ml-xl-n8, - .mx-xl-n8 { - margin-left: -5rem !important; - } - - .m-xl-auto { - margin: auto !important; - } - - .mt-xl-auto, - .my-xl-auto { - margin-top: auto !important; - } - - .mr-xl-auto, - .mx-xl-auto { - margin-right: auto !important; - } - - .mb-xl-auto, - .my-xl-auto { - margin-bottom: auto !important; - } - - .ml-xl-auto, - .mx-xl-auto { - margin-left: auto !important; - } -} - -.stretched-link::after { - position: absolute; - top: 0; - right: 0; - bottom: 0; - left: 0; - z-index: 1; - pointer-events: auto; - content: ""; - background-color: rgba(0, 0, 0, 0); -} - -.text-monospace { - font-family: SFMono-Regular, Menlo, Monaco, Consolas, "Liberation Mono", "Courier New", monospace !important; -} - -.text-justify { - text-align: justify !important; -} - -.text-wrap { - white-space: normal !important; -} - -.text-nowrap { - white-space: nowrap !important; -} - -.text-truncate { - overflow: hidden; - text-overflow: ellipsis; - white-space: nowrap; -} - -.text-left { - text-align: left !important; -} - -.text-right { - text-align: right !important; -} - -.text-center { - text-align: center !important; -} - -@media (min-width: 576px) { - .text-sm-left { - text-align: left !important; - } - - .text-sm-right { - text-align: right !important; - } - - .text-sm-center { - text-align: center !important; - } -} - -@media (min-width: 768px) { - .text-md-left { - text-align: left !important; - } - - .text-md-right { - text-align: right !important; - } - - .text-md-center { - text-align: center !important; - } -} - -@media (min-width: 992px) { - .text-lg-left { - text-align: left !important; - } - - .text-lg-right { - text-align: right !important; - } - - .text-lg-center { - text-align: center !important; - } -} - -@media (min-width: 1200px) { - .text-xl-left { - text-align: left !important; - } - - .text-xl-right { - text-align: right !important; - } - - .text-xl-center { - text-align: center !important; - } -} - -.text-lowercase { - text-transform: lowercase !important; -} - -.text-uppercase { - text-transform: uppercase !important; -} - -.text-capitalize { - text-transform: capitalize !important; -} - -.font-weight-light { - font-weight: 300 !important; -} - -.font-weight-lighter { - font-weight: lighter !important; -} - -.font-weight-normal { - font-weight: 400 !important; -} - -.font-weight-bold { - font-weight: 700 !important; -} - -.font-weight-bolder { - font-weight: bolder !important; -} - -.font-italic { - font-style: italic !important; -} - -.text-white { - color: #fff !important; -} - -.text-primary { - color: #007bff !important; -} - -a.text-primary:hover, -a.text-primary:focus { - color: #0056b3 !important; -} - -.text-secondary { - color: #6c757d !important; -} - -a.text-secondary:hover, -a.text-secondary:focus { - color: #494f54 !important; -} - -.text-success { - color: #28a745 !important; -} - -a.text-success:hover, -a.text-success:focus { - color: #19692c !important; -} - -.text-info { - color: #17a2b8 !important; -} - -a.text-info:hover, -a.text-info:focus { - color: #0f6674 !important; -} - -.text-warning { - color: #ffc107 !important; -} - -a.text-warning:hover, -a.text-warning:focus { - color: #ba8b00 !important; -} - -.text-danger { - color: #dc3545 !important; -} - -a.text-danger:hover, -a.text-danger:focus { - color: #a71d2a !important; -} - -.text-light { - color: #f8f9fa !important; -} - -a.text-light:hover, -a.text-light:focus { - color: #cbd3da !important; -} - -.text-dark { - color: #343a40 !important; -} - -a.text-dark:hover, -a.text-dark:focus { - color: #121416 !important; -} - -.text-body { - color: #212529 !important; -} - -.text-muted { - color: #6c757d !important; -} - -.text-black-50 { - color: rgba(0, 0, 0, 0.5) !important; -} - -.text-white-50 { - color: rgba(255, 255, 255, 0.5) !important; -} - -.text-hide { - font: 0/0 a; - color: transparent; - text-shadow: none; - background-color: transparent; - border: 0; -} - -.text-decoration-none { - text-decoration: none !important; -} - -.text-break { - word-break: break-word !important; - word-wrap: break-word !important; -} - -.text-reset { - color: inherit !important; -} - -.visible { - visibility: visible !important; -} - -.invisible { - visibility: hidden !important; -} - -.awesomplete > ul { - background: #333; - padding: 0 !important; -} - -.awesomplete > ul > li { - padding: 10px 15px; - border-bottom: 1px solid #707070; - color: #efefef; - font-size: 17px; -} - -.awesomplete > ul > li:last-child { - border-bottom: 0; -} - -.awesomplete > ul > li[aria-selected=true] { - background-color: #ff6f00; -} - -.awesomplete > ul > li::before { - content: none !important; -} - -img { - max-width: 100%; -} - -div { - min-width: 0; -} - -body { - color: #797F90; - font-family: Arial, sans-serif; - font-size: 18px; - line-height: 1.5; -} - -@media (min-width: 768px) { - body { - font-size: 18px; - } -} - -.html__font-loaded--primary body { - font-family: "Open Sans", Arial, sans-serif; -} - -a { - color: #FF6F00; - text-decoration: underline; -} - -h1, -.h1, -h2, -.h2, -h3, -.h3, -h4, -.h4, -h5, -.h5, -h6, -.h6 { - font-weight: 600; - color: #333; -} - -.typography-white h1, -.typography-white .h1, -.typography-white h2, -.typography-white .h2, -.typography-white h3, -.typography-white .h3, -.typography-white h4, -.typography-white .h4, -.typography-white h5, -.typography-white .h5, -.typography-white h6, -.typography-white .h6 { - color: #fff; -} - -.no-margin-top h1, -h1.no-margin-top, -.no-margin-top .h1, -.h1.no-margin-top, -.no-margin-top h2, -h2.no-margin-top, -.no-margin-top .h2, -.h2.no-margin-top, -.no-margin-top h3, -h3.no-margin-top, -.no-margin-top .h3, -.h3.no-margin-top, -.no-margin-top h4, -h4.no-margin-top, -.no-margin-top .h4, -.h4.no-margin-top, -.no-margin-top h5, -h5.no-margin-top, -.no-margin-top .h5, -.h5.no-margin-top, -.no-margin-top h6, -h6.no-margin-top, -.no-margin-top .h6, -.h6.no-margin-top { - margin-top: 0 !important; -} - -h1, -.h1 { - font-size: 12vw; - line-height: 1.2; -} - -@media (min-width: 410px) { - h1, - .h1 { - font-size: 42px; - } -} - -@media (min-width: 767px) { - h1, - .h1 { - font-size: 50px; - } -} - -h2, -.h2 { - font-size: 36px; - line-height: 1.1; -} - -@media (min-width: 768px) { - h2, - .h2 { - font-size: 40px; - } -} - -h3, -.h3 { - font-size: 26px; - line-height: 1.1; -} - -@media (min-width: 768px) { - h3, - .h3 { - font-size: 30px; - } -} - -h4, -.h4 { - font-size: 22px; -} - -h5 { - font-size: 20px; -} - -h6 { - font-size: 18px; -} - -.pb-header .navbar { - background: #333; -} - -@media (max-width: 991px) { - .pb-header .navbar { - padding-top: 10px; - padding-bottom: 10px; - } -} - -.pb-header .navbar-brand > img { - display: block; - max-width: 140px; - max-height: 25px; -} - -.pb-header .dropdown-toggle::after { - content: none; -} - -.pb-header .nav-item { - padding-top: 5px; - padding-bottom: 5px; - margin-right: 32px; -} - -.pb-header .nav-item:last-of-type { - margin-right: 0; -} - -@media (min-width: 992px) { - .pb-header .nav-item { - padding-top: 34px; - padding-bottom: 24px; - } -} - -.pb-header .nav-link { - font-size: 16px; - text-decoration: none; -} - -@media (min-width: 992px) { - .pb-header .nav-link[aria-expanded=true]::after { - position: absolute; - bottom: 0; - left: 50%; - border-style: solid; - height: 0; - width: 0; - border-color: transparent transparent #fff; - border-width: 0 5.5px 8px; - transform: translateX(-50%) translateY(0); - z-index: 5; - content: ""; - } -} - -.pb-header .dropdown-menu { - box-shadow: 10px 10px 30px rgba(0, 0, 0, 0.16); - -moz-column-rule: 1px solid #dddfe3; - column-rule: 1px solid #dddfe3; - padding: 10px 0; -} - -@media (min-width: 992px) { - .pb-header .dropdown-menu { - padding: 24px 0; - } - - .pb-header .dropdown-menu--product { - -moz-columns: 3; - columns: 3; - left: 50%; - transform: translateX(-50%); - } - - .pb-header .dropdown-menu--support { - -moz-columns: 2; - columns: 2; - left: 50%; - transform: translateX(-50%); - } - - .pb-header .dropdown-menu--resources { - right: 0; - left: auto; - } - - .pb-header .dropdown-menu .dropdown-section { - -moz-column-break-inside: avoid; - break-inside: avoid-column; - } -} - -.pb-header .dropdown-item { - font-size: 15px; - text-decoration: none; -} - -.pb-header .dropdown-item--heading { - font-weight: 600; - color: #333; -} - -.pb-header .dropdown-item--heading:hover { - color: #FF6F00; -} - -@media (max-width: 991px) { - .sidebar { - margin-bottom: 20px; - } -} - -.sidebar a { - text-decoration: none; -} - -.sidebar .navbar-toggler { - color: rgba(0, 0, 0, 0.5); - border-color: rgba(0, 0, 0, 0.1); -} - -.sidebar .navbar-toggler-icon { - background-image: url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' width='30' height='30' viewBox='0 0 30 30'%3e%3cpath stroke='rgba%280, 0, 0, 0.5%29' stroke-linecap='round' stroke-miterlimit='10' stroke-width='2' d='M4 7h22M4 15h22M4 23h22'/%3e%3c/svg%3e"); -} - -.sidebar .collapse.is-active { - display: block; -} - -.sidebar .list-group-item { - display: block; -} - -.sidebar .list-group-item--level-0 { - position: relative; - padding: 9px 12px 11px 14px; - border-top: 1px solid #dddfe3; - color: #797F90; - font-size: 20px; -} - -.sidebar .list-group-item--level-0::after { - position: absolute; - top: 50%; - right: 12px; - height: 8px; - width: 15px; - transform: translateY(-50%); - background: url(/assets/images/icons/down-carrot-0.svg) no-repeat 0 0; - content: ""; -} - -.sidebar .list-group-item--level-0:last-of-type { - border-bottom: 1px solid #dddfe3; -} - -.sidebar .list-group-item--level-0 > .pb-section-title { - display: inline-block; - padding-right: 20px; -} - -.sidebar .list-group-item--level-0.is-active { - background-color: #333; - color: #fff; -} - -.sidebar .list-group-item--level-0.is-active::after { - background-image: url(/assets/images/icons/up-carrot-0.svg); -} - -.sidebar .list-group-item--level-0.is-active + .sidebar-submenu + .list-group-item { - border-top: 0; -} - -.sidebar .list-group-item--level-1 { - padding: 8px 14px 9px; - background-color: rgba(255, 255, 255, 0.25); - border-bottom: 1px solid #dddfe3; - color: #797F90; - font-size: 18px; -} - -.sidebar .list-group-item--level-1.is-active { - position: relative; - color: #FF6F00; -} - -.sidebar .list-group-item--level-1.is-active::after { - position: absolute; - top: 50%; - right: 15px; - height: 5px; - width: 10px; - transform: translateY(-50%); - background-image: url(/assets/images/icons/up-carrot-1.svg); - background-repeat: no-repeat; - background-position: 0 0; - content: ""; -} - -.sidebar .list-group-item--level-1.is-active > .pb-section-subtitle { - display: inline-block; - padding-right: 15px; -} - -.sidebar .list-group-item--level-1.is-active + .sidebar-submenu { - background-color: rgba(255, 255, 255, 0.25); -} - -.sidebar .list-group-item--level-1 > .menu-collapsed.pb-nav-item.is-active { - color: #FF6F00; -} - -.sidebar .list-group-item--level-2 { - padding: 11px 14px 4px; - background-color: rgba(255, 255, 255, 0.5); - color: #797F90; - font-size: 15px; -} - -.sidebar .list-group-item--level-2:last-child { - padding-bottom: 11px; - border-bottom: 1px solid #dddfe3; -} - -.sidebar .list-group-item--level-2.is-active { - color: #FF6F00; -} - -.sidebar .list-group-item--level-2 > .pb-nav-item--title { - display: block; - margin-bottom: -8px; - padding-bottom: 5px; - border-bottom: 1px solid #999; - color: #333; -} - -.pb-footer { - padding-top: 50px; - padding-bottom: 30px; - background: #fff; - font-size: 12px; - line-height: 1.2; -} - -.banner--medium .card { - background: none; - border-color: rgba(255, 255, 255, 0.8); -} - -.card-media { - display: flex; - justify-content: center; - align-items: center; -} - -.card-deck--products .card-media { - min-height: 96px; - margin-top: 6px; -} - -.card-deck--products .card-title { - margin-top: 30px; -} - -.card-deck--md .card { - margin-bottom: 10px; -} - -@media (min-width: 768px) { - .card-deck--md { - display: flex; - flex-flow: row wrap; - margin-right: -10px; - margin-left: -10px; - } - - .card-deck--md .card { - flex: 1 0 0%; - margin-right: 10px; - margin-bottom: 0; - margin-left: 10px; - } -} - -.card-deck--formats .card { - margin-bottom: 10px; - z-index: 2; -} - -.card-deck--formats .card-body { - display: flex; - flex-flow: column-reverse; - justify-content: space-around; -} - -.card-deck--formats .card-title { - font-weight: 600; - margin-top: 24px; - margin-bottom: 0; - font-size: 22px; - line-height: 1.2; - color: #1BA9E1; - text-decoration: none; -} - -.card-deck--formats .card-title:hover { - color: #fff; - z-index: 2; -} - -.card-deck--formats .card-title:hover::before { - position: absolute; - top: 0; - right: 0; - bottom: 0; - left: 0; - z-index: -1; - background-color: #FF6F00; - content: ""; -} - -.card-deck--formats .card-title:hover + .card-media { - cursor: pointer; - pointer-events: none; -} - -.card-deck--formats .card-title:hover + .card-media path { - stroke: #fff; -} - -.card-deck--formats .card-title:hover + .card-media path[fill="#ff6f00"] { - fill: #fff; -} - -.card-deck--formats .card-title + .card-media { - position: relative; - z-index: 2; -} - -@media (min-width: 576px) { - .card-deck--formats { - display: flex; - flex-flow: row wrap; - justify-content: center; - margin-right: -10px; - margin-left: -10px; - } - - .card-deck--formats .card { - flex: 1 0 0%; - min-width: 180px; - max-width: 200px; - margin-right: 10px; - margin-bottom: 20px; - margin-left: 10px; - } -} - -.banner--medium .card-deck .card { - z-index: 2; -} - -.banner--medium .card-deck .card-body { - display: flex; - flex-flow: column; - justify-content: space-around; -} - -.banner--medium .card-deck .card-title { - margin-top: 24px; - margin-bottom: 0; -} - -.banner--medium .card-deck .card-title a { - color: #fff; - font-size: 26px; - text-decoration: none; -} - -.banner--medium .card-deck .card-title a::before { - position: absolute; - top: 0; - right: 0; - bottom: 0; - left: 0; - background-color: #FF6F00; - opacity: 0; - z-index: -1; - content: ""; -} - -.banner--medium .card-deck .card-title a:hover::before { - opacity: 1; -} - -.banner { - padding-top: 4rem; - padding-bottom: 5.5rem; -} - -.banner--medium { - background: #7e8c97; - color: #fff; -} - -.banner--light { - background: #fff; - padding-bottom: 0; -} - -.banner--light hr { - margin-top: 30px; - border: 0; - border-top: 1px solid rgba(221, 223, 227, 0.49); - background: none; -} - -.btn-outline-brand { - color: #1BA9E1; - border-color: #1BA9E1; - font-weight: 700; - padding: 18px 32px 15px; - border-color: #dddfe3; - font-size: 18px; - text-decoration: none; -} - -.btn-outline-brand:hover { - color: #fff; - background-color: #1BA9E1; - border-color: #1BA9E1; -} - -.btn-outline-brand:focus, -.btn-outline-brand.focus { - box-shadow: 0 0 0 0.2rem rgba(27, 169, 225, 0.5); -} - -.btn-outline-brand.disabled, -.btn-outline-brand:disabled { - color: #1BA9E1; - background-color: transparent; -} - -.btn-outline-brand:not(:disabled):not(.disabled):active, -.btn-outline-brand:not(:disabled):not(.disabled).active, -.show > .btn-outline-brand.dropdown-toggle { - color: #fff; - background-color: #1BA9E1; - border-color: #1BA9E1; -} - -.btn-outline-brand:not(:disabled):not(.disabled):active:focus, -.btn-outline-brand:not(:disabled):not(.disabled).active:focus, -.show > .btn-outline-brand.dropdown-toggle:focus { - box-shadow: 0 0 0 0.2rem rgba(27, 169, 225, 0.5); -} - -@media (min-width: 992px) { - .btn-outline-brand { - padding-right: 68px; - padding-left: 68px; - } -} - -.pb-lg-img { - width: 70%; - height: 70%; -} - -.row > .wrapper { - display: flex; - flex-wrap: wrap; - margin-right: -10px; - margin-left: -10px; -} - -@media (min-width: 992px) { - .pb-docs-container > .row > .col-lg-3.sidebar { - flex: 0 0 22%; - max-width: 22%; - } - - .pb-docs-container > .row > .col-lg-3.sidebar + .col-lg-9 { - flex: 0 0 78%; - max-width: 78%; - } -} - -.pb-docs-container + .pb-footer { - margin-top: 180px; -} - -.pb-content { - padding: 22px 30px; - border: 1px solid #dddfe3; - background-color: #fff; - font-size: 19px; - line-height: 1.5789473684; -} - -.pb-content > .pb-content { - margin: 0; - padding: 0; - border: none; -} - -.pb-content h1 { - margin-bottom: 20px; - padding-bottom: 14px; - border-bottom: 1px solid #dddfe3; - font-size: 46.379px; -} - -.pb-content h2 { - margin-top: 35px; - margin-bottom: 16px; - font-size: 37.107px; -} - -.pb-content h3 { - margin-top: 28px; - font-size: 29.697px; -} - -.pb-content h4 { - margin-top: 20px; - font-size: 23.75px; -} - -.pb-content h5 { - margin-top: 16px; - font-size: 19px; - font-style: italic; -} - -.pb-content ul { - padding-left: 20px; - list-style: none; -} - -.pb-content ul li:not(.ui-tab) { - position: relative; -} - -.pb-content ul li:not(.ui-tab)::before { - position: absolute; - top: 10px; - left: -20px; - height: 7px; - width: 7px; - border: 1px solid #707070; - border-radius: 50%; - background: #333; - content: ""; -} - -.pb-content table.table, -.pb-content table.pbTable { - font-size: 16px; - line-height: 1.75; -} - -.pb-content table.table th, -.pb-content table.pbTable th { - padding-top: 9px; - padding-bottom: 9px; - font-weight: 600; -} - -.pb-content table.table th, -.pb-content table.pbTable th, -.pb-content table.table td, -.pb-content table.pbTable td { - padding-right: 15px; - padding-left: 15px; -} - -.pb-content .pb-code-hl-wrap { - width: 100%; -} - -.pb-content .highlight, -.pb-content .pb-code-hl { - margin-top: 20px; - margin-bottom: 20px; - padding: 20px 22px 20px; - border: 1px solid #dddfe3; - background: #f8f9f9; - font-size: 16px; -} - -.pb-content .highlight pre, -.pb-content .pb-code-hl pre { - margin-top: 0; - margin-bottom: 0; - padding: 0; - border: 0; - background: none; -} - -.pb-docs-container { - margin-top: 20px; -} - -@media (min-width: 992px) { - .pb-docs-container { - margin-top: 65px; - } -} - -.pb-alert { - margin-top: 10px; -} - -.social-media { - display: flex; - align-items: center; -} - -@media (min-width: 992px) { - .social-media { - justify-content: flex-end; - margin-top: 100px; - } -} - -.social-media h5, -.social-media a { - margin-right: 22px; - margin-bottom: 0; -} - -.social-media h5 { - font-size: 18px; -} - -.social-media a:last-child { - margin-right: 0; -} - -table.table, -table.pbTable { - background: #fff; -} - -.table-bordered thead th, -.pbTable thead th, -.table-bordered thead td, -.pbTable thead td { - border-bottom-width: 1px; -} - -.download-form { - margin-bottom: 20px; -} - -.download-form > .row { - flex-flow: column; -} - -.download-form .adapters { - display: flex; - flex-flow: row wrap; -} - -.download-form__modal, -.modal-backdrop.fade { - opacity: 0; -} - -.pb-content .autocomplete-filter { - padding: 10px 15px; - border: 1px solid #b3c1cc; - background-color: rgba(236, 243, 245, 0.35); -} - -.pb-content .autocomplete-filter:focus { - outline: none; -} - -.pb-content .c-bidder-list-group h4 { - color: #797f90; - font-size: 19px; - font-weight: 700; -} - -.pb-content .c-bidder-list { - padding-left: 0; - -moz-columns: 2; - columns: 2; -} - -.pb-content .c-bidder-list li { - padding-bottom: 5px; -} - -.pb-content .c-bidder-list li::before { - content: none !important; -} - -.pb-content .c-bidder-list a { - text-decoration: none; -} - -.algolia-autocomplete .algolia-docsearch-suggestion--category-header { - display: none !important; -} - -.c-search { - position: relative; -} - -@media (max-width: 990px) { - .c-search { - float: left; - } -} - -.c-search::after { - position: absolute; - top: 50%; - right: 10px; - height: 20px; - width: 20px; - transform: translateY(-50%); - background: url(/assets/images/icons/search-icon2.svg); - background-size: cover; - content: ""; -} - -.c-search input[type=search] { - padding-right: 8px; - padding-left: 8px; - border: 1px solid rgba(0, 0, 0, 0.125); - max-width: 120px; - transition: max-width 200ms ease-in-out; - /* clears the ‘X’ from Internet Explorer */ - /* clears the ‘X’ from Chrome */ -} - -.c-search input[type=search]:hover, -.c-search input[type=search]:focus { - max-width: 200px; - outline: none; -} - -.c-search input[type=search]::-ms-clear { - display: none; - width: 0; - height: 0; -} - -.c-search input[type=search]::-ms-reveal { - display: none; - width: 0; - height: 0; -} - -.c-search input[type=search]::-webkit-search-decoration, -.c-search input[type=search]::-webkit-search-cancel-button, -.c-search input[type=search]::-webkit-search-results-button, -.c-search input[type=search]::-webkit-search-results-decoration { - display: none; -} - -.pb-homepage h1, -.pb-homepage .h1 { - font-size: 12vw; - margin-bottom: 0.75rem; -} - -@media (min-width: 768px) { - .pb-homepage h1, - .pb-homepage .h1 { - font-size: 40px; - } -} - -.error404 { - width: 100%; - height: 100%; - text-align: center; -} - -.error404 h1 { - color: #FF0000; - font-size: 60px; - font-weight: bold; -} - +.awesomplete [hidden]{display:none}.awesomplete .visually-hidden{position:absolute;clip:rect(0,0,0,0)}.awesomplete{display:inline-block;position:relative}.awesomplete>input{display:block}.awesomplete>ul{position:absolute;left:0;z-index:1;min-width:100%;box-sizing:border-box;list-style:none;padding:0;margin:0;background:#fff}.awesomplete>ul:empty{display:none}*,:after,:before{box-sizing:border-box}html{font-family:sans-serif;line-height:1.15;-webkit-text-size-adjust:100%;-webkit-tap-highlight-color:rgba(0,0,0,0)}article,aside,figcaption,figure,footer,header,hgroup,main,nav,section{display:block}body{margin:0;font-family:-apple-system,BlinkMacSystemFont,Segoe UI,Roboto,Helvetica Neue,Arial,Noto Sans,sans-serif,Apple Color Emoji,Segoe UI Emoji,Segoe UI Symbol,Noto Color Emoji;font-size:1rem;font-weight:400;color:#212529;text-align:left;background-color:#eceeef}[tabindex="-1"]:focus:not(:focus-visible){outline:0!important}hr{box-sizing:content-box;height:0;overflow:visible}h1,h2,h3,h4,h5,h6{margin-top:0;margin-bottom:.5rem}p{margin-top:0;margin-bottom:1rem}abbr[data-original-title],abbr[title]{text-decoration:underline;-webkit-text-decoration:underline dotted;text-decoration:underline dotted;cursor:help;border-bottom:0;-webkit-text-decoration-skip-ink:none;text-decoration-skip-ink:none}address{font-style:normal;line-height:inherit}address,dl,ol,ul{margin-bottom:1rem}dl,ol,ul{margin-top:0}ol ol,ol ul,ul ol,ul ul{margin-bottom:0}dt{font-weight:700}dd{margin-bottom:.5rem;margin-left:0}blockquote{margin:0 0 1rem}b,strong{font-weight:bolder}small{font-size:80%}sub,sup{position:relative;font-size:75%;line-height:0;vertical-align:baseline}sub{bottom:-.25em}sup{top:-.5em}a{color:#007bff;text-decoration:none;background-color:transparent}a:hover{color:#0056b3;text-decoration:underline}a:not([href]):not([class]),a:not([href]):not([class]):hover{color:inherit;text-decoration:none}code,kbd,pre,samp{font-family:SFMono-Regular,Menlo,Monaco,Consolas,Liberation Mono,Courier New,monospace;font-size:1em}pre{margin-top:0;margin-bottom:1rem;overflow:auto;-ms-overflow-style:scrollbar}figure{margin:0 0 1rem}img{border-style:none}img,svg{vertical-align:middle}svg{overflow:hidden}table{border-collapse:collapse}caption{padding-top:.75rem;padding-bottom:.75rem;color:#6c757d;text-align:left;caption-side:bottom}th{text-align:inherit;text-align:-webkit-match-parent}label{display:inline-block;margin-bottom:.5rem}button{border-radius:0}button:focus{outline:1px dotted;outline:5px auto -webkit-focus-ring-color}button,input,optgroup,select,textarea{margin:0;font-family:inherit;font-size:inherit;line-height:inherit}button,input{overflow:visible}button,select{text-transform:none}[role=button]{cursor:pointer}select{word-wrap:normal}[type=button],[type=reset],[type=submit],button{-webkit-appearance:button}[type=button]:not(:disabled),[type=reset]:not(:disabled),[type=submit]:not(:disabled),button:not(:disabled){cursor:pointer}[type=button]::-moz-focus-inner,[type=reset]::-moz-focus-inner,[type=submit]::-moz-focus-inner,button::-moz-focus-inner{padding:0;border-style:none}input[type=checkbox],input[type=radio]{box-sizing:border-box;padding:0}textarea{overflow:auto;resize:vertical}fieldset{min-width:0;padding:0;margin:0;border:0}legend{display:block;width:100%;max-width:100%;padding:0;margin-bottom:.5rem;font-size:1.5rem;line-height:inherit;color:inherit;white-space:normal}progress{vertical-align:baseline}[type=number]::-webkit-inner-spin-button,[type=number]::-webkit-outer-spin-button{height:auto}[type=search]{outline-offset:-2px;-webkit-appearance:none}[type=search]::-webkit-search-decoration{-webkit-appearance:none}::-webkit-file-upload-button{font:inherit;-webkit-appearance:button}output{display:inline-block}summary{display:list-item;cursor:pointer}template{display:none}[hidden]{display:none!important}.container,.container-fluid,.container-lg,.container-md,.container-sm,.container-xl{width:100%;padding-right:10px;padding-left:10px;margin-right:auto;margin-left:auto}@media (min-width:576px){.container,.container-sm{max-width:540px}}@media (min-width:768px){.container,.container-md,.container-sm{max-width:720px}}@media (min-width:992px){.container,.container-lg,.container-md,.container-sm{max-width:960px}}@media (min-width:1200px){.container,.container-lg,.container-md,.container-sm,.container-xl{max-width:1200px}}.row{display:flex;flex-wrap:wrap;margin-right:-10px;margin-left:-10px}.no-gutters{margin-right:0;margin-left:0}.no-gutters>.col,.no-gutters>[class*=col-]{padding-right:0;padding-left:0}.col,.col-1,.col-2,.col-3,.col-4,.col-5,.col-6,.col-7,.col-8,.col-9,.col-10,.col-11,.col-12,.col-auto,.col-lg,.col-lg-1,.col-lg-2,.col-lg-3,.col-lg-4,.col-lg-5,.col-lg-6,.col-lg-7,.col-lg-8,.col-lg-9,.col-lg-10,.col-lg-11,.col-lg-12,.col-lg-auto,.col-md,.col-md-1,.col-md-2,.col-md-3,.col-md-4,.col-md-5,.col-md-6,.col-md-7,.col-md-8,.col-md-9,.col-md-10,.col-md-11,.col-md-12,.col-md-auto,.col-sm,.col-sm-1,.col-sm-2,.col-sm-3,.col-sm-4,.col-sm-5,.col-sm-6,.col-sm-7,.col-sm-8,.col-sm-9,.col-sm-10,.col-sm-11,.col-sm-12,.col-sm-auto,.col-xl,.col-xl-1,.col-xl-2,.col-xl-3,.col-xl-4,.col-xl-5,.col-xl-6,.col-xl-7,.col-xl-8,.col-xl-9,.col-xl-10,.col-xl-11,.col-xl-12,.col-xl-auto{position:relative;width:100%;padding-right:10px;padding-left:10px}.col{flex-basis:0;flex-grow:1;max-width:100%}.row-cols-1>*{flex:0 0 100%;max-width:100%}.row-cols-2>*{flex:0 0 50%;max-width:50%}.row-cols-3>*{flex:0 0 33.3333333333%;max-width:33.3333333333%}.row-cols-4>*{flex:0 0 25%;max-width:25%}.row-cols-5>*{flex:0 0 20%;max-width:20%}.row-cols-6>*{flex:0 0 16.6666666667%;max-width:16.6666666667%}.col-auto{flex:0 0 auto;width:auto;max-width:100%}.col-1{flex:0 0 8.3333333333%;max-width:8.3333333333%}.col-2{flex:0 0 16.6666666667%;max-width:16.6666666667%}.col-3{flex:0 0 25%;max-width:25%}.col-4{flex:0 0 33.3333333333%;max-width:33.3333333333%}.col-5{flex:0 0 41.6666666667%;max-width:41.6666666667%}.col-6{flex:0 0 50%;max-width:50%}.col-7{flex:0 0 58.3333333333%;max-width:58.3333333333%}.col-8{flex:0 0 66.6666666667%;max-width:66.6666666667%}.col-9{flex:0 0 75%;max-width:75%}.col-10{flex:0 0 83.3333333333%;max-width:83.3333333333%}.col-11{flex:0 0 91.6666666667%;max-width:91.6666666667%}.col-12{flex:0 0 100%;max-width:100%}.order-first{order:-1}.order-last{order:13}.order-0{order:0}.order-1{order:1}.order-2{order:2}.order-3{order:3}.order-4{order:4}.order-5{order:5}.order-6{order:6}.order-7{order:7}.order-8{order:8}.order-9{order:9}.order-10{order:10}.order-11{order:11}.order-12{order:12}.offset-1{margin-left:8.3333333333%}.offset-2{margin-left:16.6666666667%}.offset-3{margin-left:25%}.offset-4{margin-left:33.3333333333%}.offset-5{margin-left:41.6666666667%}.offset-6{margin-left:50%}.offset-7{margin-left:58.3333333333%}.offset-8{margin-left:66.6666666667%}.offset-9{margin-left:75%}.offset-10{margin-left:83.3333333333%}.offset-11{margin-left:91.6666666667%}@media (min-width:576px){.col-sm{flex-basis:0;flex-grow:1;max-width:100%}.row-cols-sm-1>*{flex:0 0 100%;max-width:100%}.row-cols-sm-2>*{flex:0 0 50%;max-width:50%}.row-cols-sm-3>*{flex:0 0 33.3333333333%;max-width:33.3333333333%}.row-cols-sm-4>*{flex:0 0 25%;max-width:25%}.row-cols-sm-5>*{flex:0 0 20%;max-width:20%}.row-cols-sm-6>*{flex:0 0 16.6666666667%;max-width:16.6666666667%}.col-sm-auto{flex:0 0 auto;width:auto;max-width:100%}.col-sm-1{flex:0 0 8.3333333333%;max-width:8.3333333333%}.col-sm-2{flex:0 0 16.6666666667%;max-width:16.6666666667%}.col-sm-3{flex:0 0 25%;max-width:25%}.col-sm-4{flex:0 0 33.3333333333%;max-width:33.3333333333%}.col-sm-5{flex:0 0 41.6666666667%;max-width:41.6666666667%}.col-sm-6{flex:0 0 50%;max-width:50%}.col-sm-7{flex:0 0 58.3333333333%;max-width:58.3333333333%}.col-sm-8{flex:0 0 66.6666666667%;max-width:66.6666666667%}.col-sm-9{flex:0 0 75%;max-width:75%}.col-sm-10{flex:0 0 83.3333333333%;max-width:83.3333333333%}.col-sm-11{flex:0 0 91.6666666667%;max-width:91.6666666667%}.col-sm-12{flex:0 0 100%;max-width:100%}.order-sm-first{order:-1}.order-sm-last{order:13}.order-sm-0{order:0}.order-sm-1{order:1}.order-sm-2{order:2}.order-sm-3{order:3}.order-sm-4{order:4}.order-sm-5{order:5}.order-sm-6{order:6}.order-sm-7{order:7}.order-sm-8{order:8}.order-sm-9{order:9}.order-sm-10{order:10}.order-sm-11{order:11}.order-sm-12{order:12}.offset-sm-0{margin-left:0}.offset-sm-1{margin-left:8.3333333333%}.offset-sm-2{margin-left:16.6666666667%}.offset-sm-3{margin-left:25%}.offset-sm-4{margin-left:33.3333333333%}.offset-sm-5{margin-left:41.6666666667%}.offset-sm-6{margin-left:50%}.offset-sm-7{margin-left:58.3333333333%}.offset-sm-8{margin-left:66.6666666667%}.offset-sm-9{margin-left:75%}.offset-sm-10{margin-left:83.3333333333%}.offset-sm-11{margin-left:91.6666666667%}}@media (min-width:768px){.col-md{flex-basis:0;flex-grow:1;max-width:100%}.row-cols-md-1>*{flex:0 0 100%;max-width:100%}.row-cols-md-2>*{flex:0 0 50%;max-width:50%}.row-cols-md-3>*{flex:0 0 33.3333333333%;max-width:33.3333333333%}.row-cols-md-4>*{flex:0 0 25%;max-width:25%}.row-cols-md-5>*{flex:0 0 20%;max-width:20%}.row-cols-md-6>*{flex:0 0 16.6666666667%;max-width:16.6666666667%}.col-md-auto{flex:0 0 auto;width:auto;max-width:100%}.col-md-1{flex:0 0 8.3333333333%;max-width:8.3333333333%}.col-md-2{flex:0 0 16.6666666667%;max-width:16.6666666667%}.col-md-3{flex:0 0 25%;max-width:25%}.col-md-4{flex:0 0 33.3333333333%;max-width:33.3333333333%}.col-md-5{flex:0 0 41.6666666667%;max-width:41.6666666667%}.col-md-6{flex:0 0 50%;max-width:50%}.col-md-7{flex:0 0 58.3333333333%;max-width:58.3333333333%}.col-md-8{flex:0 0 66.6666666667%;max-width:66.6666666667%}.col-md-9{flex:0 0 75%;max-width:75%}.col-md-10{flex:0 0 83.3333333333%;max-width:83.3333333333%}.col-md-11{flex:0 0 91.6666666667%;max-width:91.6666666667%}.col-md-12{flex:0 0 100%;max-width:100%}.order-md-first{order:-1}.order-md-last{order:13}.order-md-0{order:0}.order-md-1{order:1}.order-md-2{order:2}.order-md-3{order:3}.order-md-4{order:4}.order-md-5{order:5}.order-md-6{order:6}.order-md-7{order:7}.order-md-8{order:8}.order-md-9{order:9}.order-md-10{order:10}.order-md-11{order:11}.order-md-12{order:12}.offset-md-0{margin-left:0}.offset-md-1{margin-left:8.3333333333%}.offset-md-2{margin-left:16.6666666667%}.offset-md-3{margin-left:25%}.offset-md-4{margin-left:33.3333333333%}.offset-md-5{margin-left:41.6666666667%}.offset-md-6{margin-left:50%}.offset-md-7{margin-left:58.3333333333%}.offset-md-8{margin-left:66.6666666667%}.offset-md-9{margin-left:75%}.offset-md-10{margin-left:83.3333333333%}.offset-md-11{margin-left:91.6666666667%}}@media (min-width:992px){.col-lg{flex-basis:0;flex-grow:1;max-width:100%}.row-cols-lg-1>*{flex:0 0 100%;max-width:100%}.row-cols-lg-2>*{flex:0 0 50%;max-width:50%}.row-cols-lg-3>*{flex:0 0 33.3333333333%;max-width:33.3333333333%}.row-cols-lg-4>*{flex:0 0 25%;max-width:25%}.row-cols-lg-5>*{flex:0 0 20%;max-width:20%}.row-cols-lg-6>*{flex:0 0 16.6666666667%;max-width:16.6666666667%}.col-lg-auto{flex:0 0 auto;width:auto;max-width:100%}.col-lg-1{flex:0 0 8.3333333333%;max-width:8.3333333333%}.col-lg-2{flex:0 0 16.6666666667%;max-width:16.6666666667%}.col-lg-3{flex:0 0 25%;max-width:25%}.col-lg-4{flex:0 0 33.3333333333%;max-width:33.3333333333%}.col-lg-5{flex:0 0 41.6666666667%;max-width:41.6666666667%}.col-lg-6{flex:0 0 50%;max-width:50%}.col-lg-7{flex:0 0 58.3333333333%;max-width:58.3333333333%}.col-lg-8{flex:0 0 66.6666666667%;max-width:66.6666666667%}.col-lg-9{flex:0 0 75%;max-width:75%}.col-lg-10{flex:0 0 83.3333333333%;max-width:83.3333333333%}.col-lg-11{flex:0 0 91.6666666667%;max-width:91.6666666667%}.col-lg-12{flex:0 0 100%;max-width:100%}.order-lg-first{order:-1}.order-lg-last{order:13}.order-lg-0{order:0}.order-lg-1{order:1}.order-lg-2{order:2}.order-lg-3{order:3}.order-lg-4{order:4}.order-lg-5{order:5}.order-lg-6{order:6}.order-lg-7{order:7}.order-lg-8{order:8}.order-lg-9{order:9}.order-lg-10{order:10}.order-lg-11{order:11}.order-lg-12{order:12}.offset-lg-0{margin-left:0}.offset-lg-1{margin-left:8.3333333333%}.offset-lg-2{margin-left:16.6666666667%}.offset-lg-3{margin-left:25%}.offset-lg-4{margin-left:33.3333333333%}.offset-lg-5{margin-left:41.6666666667%}.offset-lg-6{margin-left:50%}.offset-lg-7{margin-left:58.3333333333%}.offset-lg-8{margin-left:66.6666666667%}.offset-lg-9{margin-left:75%}.offset-lg-10{margin-left:83.3333333333%}.offset-lg-11{margin-left:91.6666666667%}}@media (min-width:1200px){.col-xl{flex-basis:0;flex-grow:1;max-width:100%}.row-cols-xl-1>*{flex:0 0 100%;max-width:100%}.row-cols-xl-2>*{flex:0 0 50%;max-width:50%}.row-cols-xl-3>*{flex:0 0 33.3333333333%;max-width:33.3333333333%}.row-cols-xl-4>*{flex:0 0 25%;max-width:25%}.row-cols-xl-5>*{flex:0 0 20%;max-width:20%}.row-cols-xl-6>*{flex:0 0 16.6666666667%;max-width:16.6666666667%}.col-xl-auto{flex:0 0 auto;width:auto;max-width:100%}.col-xl-1{flex:0 0 8.3333333333%;max-width:8.3333333333%}.col-xl-2{flex:0 0 16.6666666667%;max-width:16.6666666667%}.col-xl-3{flex:0 0 25%;max-width:25%}.col-xl-4{flex:0 0 33.3333333333%;max-width:33.3333333333%}.col-xl-5{flex:0 0 41.6666666667%;max-width:41.6666666667%}.col-xl-6{flex:0 0 50%;max-width:50%}.col-xl-7{flex:0 0 58.3333333333%;max-width:58.3333333333%}.col-xl-8{flex:0 0 66.6666666667%;max-width:66.6666666667%}.col-xl-9{flex:0 0 75%;max-width:75%}.col-xl-10{flex:0 0 83.3333333333%;max-width:83.3333333333%}.col-xl-11{flex:0 0 91.6666666667%;max-width:91.6666666667%}.col-xl-12{flex:0 0 100%;max-width:100%}.order-xl-first{order:-1}.order-xl-last{order:13}.order-xl-0{order:0}.order-xl-1{order:1}.order-xl-2{order:2}.order-xl-3{order:3}.order-xl-4{order:4}.order-xl-5{order:5}.order-xl-6{order:6}.order-xl-7{order:7}.order-xl-8{order:8}.order-xl-9{order:9}.order-xl-10{order:10}.order-xl-11{order:11}.order-xl-12{order:12}.offset-xl-0{margin-left:0}.offset-xl-1{margin-left:8.3333333333%}.offset-xl-2{margin-left:16.6666666667%}.offset-xl-3{margin-left:25%}.offset-xl-4{margin-left:33.3333333333%}.offset-xl-5{margin-left:41.6666666667%}.offset-xl-6{margin-left:50%}.offset-xl-7{margin-left:58.3333333333%}.offset-xl-8{margin-left:66.6666666667%}.offset-xl-9{margin-left:75%}.offset-xl-10{margin-left:83.3333333333%}.offset-xl-11{margin-left:91.6666666667%}}.btn{display:inline-block;font-weight:400;color:#212529;text-align:center;vertical-align:middle;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none;background-color:transparent;border:1px solid transparent;padding:.375rem .75rem;font-size:1rem;line-height:1.5;border-radius:.25rem;transition:color .15s ease-in-out,background-color .15s ease-in-out,border-color .15s ease-in-out,box-shadow .15s ease-in-out}@media (prefers-reduced-motion:reduce){.btn{transition:none}}.btn:hover{color:#212529;text-decoration:none}.btn.focus,.btn:focus{outline:0;box-shadow:0 0 0 .2rem rgba(0,123,255,.25)}.btn.disabled,.btn:disabled{opacity:.65}.btn:not(:disabled):not(.disabled){cursor:pointer}a.btn.disabled,fieldset:disabled a.btn{pointer-events:none}.btn-primary{color:#fff;background-color:#007bff;border-color:#007bff}.btn-primary.focus,.btn-primary:focus,.btn-primary:hover{color:#fff;background-color:#0069d9;border-color:#0062cc}.btn-primary.focus,.btn-primary:focus{box-shadow:0 0 0 .2rem rgba(38,143,255,.5)}.btn-primary.disabled,.btn-primary:disabled{color:#fff;background-color:#007bff;border-color:#007bff}.btn-primary:not(:disabled):not(.disabled).active,.btn-primary:not(:disabled):not(.disabled):active,.show>.btn-primary.dropdown-toggle{color:#fff;background-color:#0062cc;border-color:#005cbf}.btn-primary:not(:disabled):not(.disabled).active:focus,.btn-primary:not(:disabled):not(.disabled):active:focus,.show>.btn-primary.dropdown-toggle:focus{box-shadow:0 0 0 .2rem rgba(38,143,255,.5)}.btn-secondary{color:#fff;background-color:#6c757d;border-color:#6c757d}.btn-secondary.focus,.btn-secondary:focus,.btn-secondary:hover{color:#fff;background-color:#5a6268;border-color:#545b62}.btn-secondary.focus,.btn-secondary:focus{box-shadow:0 0 0 .2rem rgba(130,138,145,.5)}.btn-secondary.disabled,.btn-secondary:disabled{color:#fff;background-color:#6c757d;border-color:#6c757d}.btn-secondary:not(:disabled):not(.disabled).active,.btn-secondary:not(:disabled):not(.disabled):active,.show>.btn-secondary.dropdown-toggle{color:#fff;background-color:#545b62;border-color:#4e555b}.btn-secondary:not(:disabled):not(.disabled).active:focus,.btn-secondary:not(:disabled):not(.disabled):active:focus,.show>.btn-secondary.dropdown-toggle:focus{box-shadow:0 0 0 .2rem rgba(130,138,145,.5)}.btn-success{color:#fff;background-color:#28a745;border-color:#28a745}.btn-success.focus,.btn-success:focus,.btn-success:hover{color:#fff;background-color:#218838;border-color:#1e7e34}.btn-success.focus,.btn-success:focus{box-shadow:0 0 0 .2rem rgba(72,180,97,.5)}.btn-success.disabled,.btn-success:disabled{color:#fff;background-color:#28a745;border-color:#28a745}.btn-success:not(:disabled):not(.disabled).active,.btn-success:not(:disabled):not(.disabled):active,.show>.btn-success.dropdown-toggle{color:#fff;background-color:#1e7e34;border-color:#1c7430}.btn-success:not(:disabled):not(.disabled).active:focus,.btn-success:not(:disabled):not(.disabled):active:focus,.show>.btn-success.dropdown-toggle:focus{box-shadow:0 0 0 .2rem rgba(72,180,97,.5)}.btn-info{color:#fff;background-color:#17a2b8;border-color:#17a2b8}.btn-info.focus,.btn-info:focus,.btn-info:hover{color:#fff;background-color:#138496;border-color:#117a8b}.btn-info.focus,.btn-info:focus{box-shadow:0 0 0 .2rem rgba(58,176,195,.5)}.btn-info.disabled,.btn-info:disabled{color:#fff;background-color:#17a2b8;border-color:#17a2b8}.btn-info:not(:disabled):not(.disabled).active,.btn-info:not(:disabled):not(.disabled):active,.show>.btn-info.dropdown-toggle{color:#fff;background-color:#117a8b;border-color:#10707f}.btn-info:not(:disabled):not(.disabled).active:focus,.btn-info:not(:disabled):not(.disabled):active:focus,.show>.btn-info.dropdown-toggle:focus{box-shadow:0 0 0 .2rem rgba(58,176,195,.5)}.btn-warning{color:#212529;background-color:#ffc107;border-color:#ffc107}.btn-warning.focus,.btn-warning:focus,.btn-warning:hover{color:#212529;background-color:#e0a800;border-color:#d39e00}.btn-warning.focus,.btn-warning:focus{box-shadow:0 0 0 .2rem rgba(222,170,12,.5)}.btn-warning.disabled,.btn-warning:disabled{color:#212529;background-color:#ffc107;border-color:#ffc107}.btn-warning:not(:disabled):not(.disabled).active,.btn-warning:not(:disabled):not(.disabled):active,.show>.btn-warning.dropdown-toggle{color:#212529;background-color:#d39e00;border-color:#c69500}.btn-warning:not(:disabled):not(.disabled).active:focus,.btn-warning:not(:disabled):not(.disabled):active:focus,.show>.btn-warning.dropdown-toggle:focus{box-shadow:0 0 0 .2rem rgba(222,170,12,.5)}.btn-danger{color:#fff;background-color:#dc3545;border-color:#dc3545}.btn-danger.focus,.btn-danger:focus,.btn-danger:hover{color:#fff;background-color:#c82333;border-color:#bd2130}.btn-danger.focus,.btn-danger:focus{box-shadow:0 0 0 .2rem rgba(225,83,97,.5)}.btn-danger.disabled,.btn-danger:disabled{color:#fff;background-color:#dc3545;border-color:#dc3545}.btn-danger:not(:disabled):not(.disabled).active,.btn-danger:not(:disabled):not(.disabled):active,.show>.btn-danger.dropdown-toggle{color:#fff;background-color:#bd2130;border-color:#b21f2d}.btn-danger:not(:disabled):not(.disabled).active:focus,.btn-danger:not(:disabled):not(.disabled):active:focus,.show>.btn-danger.dropdown-toggle:focus{box-shadow:0 0 0 .2rem rgba(225,83,97,.5)}.btn-light{color:#212529;background-color:#f8f9fa;border-color:#f8f9fa}.btn-light.focus,.btn-light:focus,.btn-light:hover{color:#212529;background-color:#e2e6ea;border-color:#dae0e5}.btn-light.focus,.btn-light:focus{box-shadow:0 0 0 .2rem rgba(216,217,219,.5)}.btn-light.disabled,.btn-light:disabled{color:#212529;background-color:#f8f9fa;border-color:#f8f9fa}.btn-light:not(:disabled):not(.disabled).active,.btn-light:not(:disabled):not(.disabled):active,.show>.btn-light.dropdown-toggle{color:#212529;background-color:#dae0e5;border-color:#d3d9df}.btn-light:not(:disabled):not(.disabled).active:focus,.btn-light:not(:disabled):not(.disabled):active:focus,.show>.btn-light.dropdown-toggle:focus{box-shadow:0 0 0 .2rem rgba(216,217,219,.5)}.btn-dark{color:#fff;background-color:#343a40;border-color:#343a40}.btn-dark.focus,.btn-dark:focus,.btn-dark:hover{color:#fff;background-color:#23272b;border-color:#1d2124}.btn-dark.focus,.btn-dark:focus{box-shadow:0 0 0 .2rem rgba(82,88,93,.5)}.btn-dark.disabled,.btn-dark:disabled{color:#fff;background-color:#343a40;border-color:#343a40}.btn-dark:not(:disabled):not(.disabled).active,.btn-dark:not(:disabled):not(.disabled):active,.show>.btn-dark.dropdown-toggle{color:#fff;background-color:#1d2124;border-color:#171a1d}.btn-dark:not(:disabled):not(.disabled).active:focus,.btn-dark:not(:disabled):not(.disabled):active:focus,.show>.btn-dark.dropdown-toggle:focus{box-shadow:0 0 0 .2rem rgba(82,88,93,.5)}.btn-outline-primary{color:#007bff;border-color:#007bff}.btn-outline-primary:hover{color:#fff;background-color:#007bff;border-color:#007bff}.btn-outline-primary.focus,.btn-outline-primary:focus{box-shadow:0 0 0 .2rem rgba(0,123,255,.5)}.btn-outline-primary.disabled,.btn-outline-primary:disabled{color:#007bff;background-color:transparent}.btn-outline-primary:not(:disabled):not(.disabled).active,.btn-outline-primary:not(:disabled):not(.disabled):active,.show>.btn-outline-primary.dropdown-toggle{color:#fff;background-color:#007bff;border-color:#007bff}.btn-outline-primary:not(:disabled):not(.disabled).active:focus,.btn-outline-primary:not(:disabled):not(.disabled):active:focus,.show>.btn-outline-primary.dropdown-toggle:focus{box-shadow:0 0 0 .2rem rgba(0,123,255,.5)}.btn-outline-secondary{color:#6c757d;border-color:#6c757d}.btn-outline-secondary:hover{color:#fff;background-color:#6c757d;border-color:#6c757d}.btn-outline-secondary.focus,.btn-outline-secondary:focus{box-shadow:0 0 0 .2rem rgba(108,117,125,.5)}.btn-outline-secondary.disabled,.btn-outline-secondary:disabled{color:#6c757d;background-color:transparent}.btn-outline-secondary:not(:disabled):not(.disabled).active,.btn-outline-secondary:not(:disabled):not(.disabled):active,.show>.btn-outline-secondary.dropdown-toggle{color:#fff;background-color:#6c757d;border-color:#6c757d}.btn-outline-secondary:not(:disabled):not(.disabled).active:focus,.btn-outline-secondary:not(:disabled):not(.disabled):active:focus,.show>.btn-outline-secondary.dropdown-toggle:focus{box-shadow:0 0 0 .2rem rgba(108,117,125,.5)}.btn-outline-success{color:#28a745;border-color:#28a745}.btn-outline-success:hover{color:#fff;background-color:#28a745;border-color:#28a745}.btn-outline-success.focus,.btn-outline-success:focus{box-shadow:0 0 0 .2rem rgba(40,167,69,.5)}.btn-outline-success.disabled,.btn-outline-success:disabled{color:#28a745;background-color:transparent}.btn-outline-success:not(:disabled):not(.disabled).active,.btn-outline-success:not(:disabled):not(.disabled):active,.show>.btn-outline-success.dropdown-toggle{color:#fff;background-color:#28a745;border-color:#28a745}.btn-outline-success:not(:disabled):not(.disabled).active:focus,.btn-outline-success:not(:disabled):not(.disabled):active:focus,.show>.btn-outline-success.dropdown-toggle:focus{box-shadow:0 0 0 .2rem rgba(40,167,69,.5)}.btn-outline-info{color:#17a2b8;border-color:#17a2b8}.btn-outline-info:hover{color:#fff;background-color:#17a2b8;border-color:#17a2b8}.btn-outline-info.focus,.btn-outline-info:focus{box-shadow:0 0 0 .2rem rgba(23,162,184,.5)}.btn-outline-info.disabled,.btn-outline-info:disabled{color:#17a2b8;background-color:transparent}.btn-outline-info:not(:disabled):not(.disabled).active,.btn-outline-info:not(:disabled):not(.disabled):active,.show>.btn-outline-info.dropdown-toggle{color:#fff;background-color:#17a2b8;border-color:#17a2b8}.btn-outline-info:not(:disabled):not(.disabled).active:focus,.btn-outline-info:not(:disabled):not(.disabled):active:focus,.show>.btn-outline-info.dropdown-toggle:focus{box-shadow:0 0 0 .2rem rgba(23,162,184,.5)}.btn-outline-warning{color:#ffc107;border-color:#ffc107}.btn-outline-warning:hover{color:#212529;background-color:#ffc107;border-color:#ffc107}.btn-outline-warning.focus,.btn-outline-warning:focus{box-shadow:0 0 0 .2rem rgba(255,193,7,.5)}.btn-outline-warning.disabled,.btn-outline-warning:disabled{color:#ffc107;background-color:transparent}.btn-outline-warning:not(:disabled):not(.disabled).active,.btn-outline-warning:not(:disabled):not(.disabled):active,.show>.btn-outline-warning.dropdown-toggle{color:#212529;background-color:#ffc107;border-color:#ffc107}.btn-outline-warning:not(:disabled):not(.disabled).active:focus,.btn-outline-warning:not(:disabled):not(.disabled):active:focus,.show>.btn-outline-warning.dropdown-toggle:focus{box-shadow:0 0 0 .2rem rgba(255,193,7,.5)}.btn-outline-danger{color:#dc3545;border-color:#dc3545}.btn-outline-danger:hover{color:#fff;background-color:#dc3545;border-color:#dc3545}.btn-outline-danger.focus,.btn-outline-danger:focus{box-shadow:0 0 0 .2rem rgba(220,53,69,.5)}.btn-outline-danger.disabled,.btn-outline-danger:disabled{color:#dc3545;background-color:transparent}.btn-outline-danger:not(:disabled):not(.disabled).active,.btn-outline-danger:not(:disabled):not(.disabled):active,.show>.btn-outline-danger.dropdown-toggle{color:#fff;background-color:#dc3545;border-color:#dc3545}.btn-outline-danger:not(:disabled):not(.disabled).active:focus,.btn-outline-danger:not(:disabled):not(.disabled):active:focus,.show>.btn-outline-danger.dropdown-toggle:focus{box-shadow:0 0 0 .2rem rgba(220,53,69,.5)}.btn-outline-light{color:#f8f9fa;border-color:#f8f9fa}.btn-outline-light:hover{color:#212529;background-color:#f8f9fa;border-color:#f8f9fa}.btn-outline-light.focus,.btn-outline-light:focus{box-shadow:0 0 0 .2rem rgba(248,249,250,.5)}.btn-outline-light.disabled,.btn-outline-light:disabled{color:#f8f9fa;background-color:transparent}.btn-outline-light:not(:disabled):not(.disabled).active,.btn-outline-light:not(:disabled):not(.disabled):active,.show>.btn-outline-light.dropdown-toggle{color:#212529;background-color:#f8f9fa;border-color:#f8f9fa}.btn-outline-light:not(:disabled):not(.disabled).active:focus,.btn-outline-light:not(:disabled):not(.disabled):active:focus,.show>.btn-outline-light.dropdown-toggle:focus{box-shadow:0 0 0 .2rem rgba(248,249,250,.5)}.btn-outline-dark{color:#343a40;border-color:#343a40}.btn-outline-dark:hover{color:#fff;background-color:#343a40;border-color:#343a40}.btn-outline-dark.focus,.btn-outline-dark:focus{box-shadow:0 0 0 .2rem rgba(52,58,64,.5)}.btn-outline-dark.disabled,.btn-outline-dark:disabled{color:#343a40;background-color:transparent}.btn-outline-dark:not(:disabled):not(.disabled).active,.btn-outline-dark:not(:disabled):not(.disabled):active,.show>.btn-outline-dark.dropdown-toggle{color:#fff;background-color:#343a40;border-color:#343a40}.btn-outline-dark:not(:disabled):not(.disabled).active:focus,.btn-outline-dark:not(:disabled):not(.disabled):active:focus,.show>.btn-outline-dark.dropdown-toggle:focus{box-shadow:0 0 0 .2rem rgba(52,58,64,.5)}.btn-link{font-weight:400;color:#007bff;text-decoration:none}.btn-link:hover{color:#0056b3}.btn-link.focus,.btn-link:focus,.btn-link:hover{text-decoration:underline}.btn-link.disabled,.btn-link:disabled{color:#6c757d;pointer-events:none}.btn-lg{padding:.5rem 1rem;font-size:1.25rem;line-height:1.5;border-radius:.3rem}.btn-sm{padding:.25rem .5rem;font-size:.875rem;line-height:1.5;border-radius:.2rem}.btn-block{display:block;width:100%}.btn-block+.btn-block{margin-top:.5rem}input[type=button].btn-block,input[type=reset].btn-block,input[type=submit].btn-block{width:100%}.fade{transition:opacity .15s linear}@media (prefers-reduced-motion:reduce){.fade{transition:none}}.fade:not(.show){opacity:0}.collapse:not(.show){display:none}.collapsing{position:relative;height:0;overflow:hidden;transition:height .35s ease}@media (prefers-reduced-motion:reduce){.collapsing{transition:none}}.dropdown,.dropleft,.dropright,.dropup{position:relative}.dropdown-toggle{white-space:nowrap}.dropdown-toggle:after{display:inline-block;margin-left:.255em;vertical-align:.255em;content:"";border-top:.3em solid;border-right:.3em solid transparent;border-bottom:0;border-left:.3em solid transparent}.dropdown-toggle:empty:after{margin-left:0}.dropdown-menu{position:absolute;top:100%;left:0;z-index:1000;display:none;float:left;min-width:10rem;padding:24px 0;margin:0;font-size:1rem;color:#212529;text-align:left;list-style:none;background-color:#fff;background-clip:padding-box;border:0 solid rgba(0,0,0,.15);border-radius:0}.dropdown-menu-left{right:auto;left:0}.dropdown-menu-right{right:0;left:auto}@media (min-width:576px){.dropdown-menu-sm-left{right:auto;left:0}.dropdown-menu-sm-right{right:0;left:auto}}@media (min-width:768px){.dropdown-menu-md-left{right:auto;left:0}.dropdown-menu-md-right{right:0;left:auto}}@media (min-width:992px){.dropdown-menu-lg-left{right:auto;left:0}.dropdown-menu-lg-right{right:0;left:auto}}@media (min-width:1200px){.dropdown-menu-xl-left{right:auto;left:0}.dropdown-menu-xl-right{right:0;left:auto}}.dropup .dropdown-menu{top:auto;bottom:100%;margin-top:0;margin-bottom:0}.dropup .dropdown-toggle:after{display:inline-block;margin-left:.255em;vertical-align:.255em;content:"";border-top:0;border-right:.3em solid transparent;border-bottom:.3em solid;border-left:.3em solid transparent}.dropup .dropdown-toggle:empty:after{margin-left:0}.dropright .dropdown-menu{top:0;right:auto;left:100%;margin-top:0;margin-left:0}.dropright .dropdown-toggle:after{display:inline-block;margin-left:.255em;vertical-align:.255em;content:"";border-top:.3em solid transparent;border-right:0;border-bottom:.3em solid transparent;border-left:.3em solid}.dropright .dropdown-toggle:empty:after{margin-left:0}.dropright .dropdown-toggle:after{vertical-align:0}.dropleft .dropdown-menu{top:0;right:100%;left:auto;margin-top:0;margin-right:0}.dropleft .dropdown-toggle:after{display:inline-block;margin-left:.255em;vertical-align:.255em;content:"";display:none}.dropleft .dropdown-toggle:before{display:inline-block;margin-right:.255em;vertical-align:.255em;content:"";border-top:.3em solid transparent;border-right:.3em solid;border-bottom:.3em solid transparent}.dropleft .dropdown-toggle:empty:after{margin-left:0}.dropleft .dropdown-toggle:before{vertical-align:0}.dropdown-menu[x-placement^=bottom],.dropdown-menu[x-placement^=left],.dropdown-menu[x-placement^=right],.dropdown-menu[x-placement^=top]{right:auto;bottom:auto}.dropdown-divider{height:0;margin:.5rem 0;overflow:hidden;border-top:1px solid #e9ecef}.dropdown-item{display:block;width:100%;padding:.25rem 1.5rem;clear:both;font-weight:400;color:#797f90;text-align:inherit;white-space:nowrap;background-color:transparent;border:0}.dropdown-item:focus,.dropdown-item:hover{color:#ff6f00;text-decoration:none;background-color:transparent}.dropdown-item.active,.dropdown-item:active{color:#fff;text-decoration:none;background-color:#007bff}.dropdown-item.disabled,.dropdown-item:disabled{color:#6c757d;pointer-events:none;background-color:transparent}.dropdown-menu.show{display:block}.dropdown-header{display:block;padding:24px 1.5rem;margin-bottom:0;font-size:.875rem;color:#6c757d;white-space:nowrap}.dropdown-item-text{display:block;padding:.25rem 1.5rem;color:#797f90}.navbar{position:relative;padding:0 1rem}.navbar,.navbar .container,.navbar .container-fluid,.navbar .container-lg,.navbar .container-md,.navbar .container-sm,.navbar .container-xl{display:flex;flex-wrap:wrap;align-items:center;justify-content:space-between}.navbar-brand{display:inline-block;padding-top:-.1875rem;padding-bottom:-.1875rem;margin-right:1rem;font-size:1.25rem;line-height:inherit;white-space:nowrap}.navbar-brand:focus,.navbar-brand:hover{text-decoration:none}.navbar-nav{display:flex;flex-direction:column;padding-left:0;margin-bottom:0;list-style:none}.navbar-nav .nav-link{padding-right:0;padding-left:0}.navbar-nav .dropdown-menu{position:static;float:none}.navbar-text{display:inline-block;padding-top:0;padding-bottom:0}.navbar-collapse{flex-basis:100%;flex-grow:1;align-items:center}.navbar-toggler{padding:.25rem .75rem;font-size:1.25rem;line-height:1;background-color:transparent;border:1px solid transparent;border-radius:.25rem}.navbar-toggler:focus,.navbar-toggler:hover{text-decoration:none}.navbar-toggler-icon{display:inline-block;width:1.5em;height:1.5em;vertical-align:middle;content:"";background:no-repeat 50%;background-size:100% 100%}@media (max-width:575.98px){.navbar-expand-sm>.container,.navbar-expand-sm>.container-fluid,.navbar-expand-sm>.container-lg,.navbar-expand-sm>.container-md,.navbar-expand-sm>.container-sm,.navbar-expand-sm>.container-xl{padding-right:0;padding-left:0}}@media (min-width:576px){.navbar-expand-sm{flex-flow:row nowrap;justify-content:flex-start}.navbar-expand-sm .navbar-nav{flex-direction:row}.navbar-expand-sm .navbar-nav .dropdown-menu{position:absolute}.navbar-expand-sm .navbar-nav .nav-link{padding-right:0;padding-left:0}.navbar-expand-sm>.container,.navbar-expand-sm>.container-fluid,.navbar-expand-sm>.container-lg,.navbar-expand-sm>.container-md,.navbar-expand-sm>.container-sm,.navbar-expand-sm>.container-xl{flex-wrap:nowrap}.navbar-expand-sm .navbar-collapse{display:flex!important;flex-basis:auto}.navbar-expand-sm .navbar-toggler{display:none}}@media (max-width:767.98px){.navbar-expand-md>.container,.navbar-expand-md>.container-fluid,.navbar-expand-md>.container-lg,.navbar-expand-md>.container-md,.navbar-expand-md>.container-sm,.navbar-expand-md>.container-xl{padding-right:0;padding-left:0}}@media (min-width:768px){.navbar-expand-md{flex-flow:row nowrap;justify-content:flex-start}.navbar-expand-md .navbar-nav{flex-direction:row}.navbar-expand-md .navbar-nav .dropdown-menu{position:absolute}.navbar-expand-md .navbar-nav .nav-link{padding-right:0;padding-left:0}.navbar-expand-md>.container,.navbar-expand-md>.container-fluid,.navbar-expand-md>.container-lg,.navbar-expand-md>.container-md,.navbar-expand-md>.container-sm,.navbar-expand-md>.container-xl{flex-wrap:nowrap}.navbar-expand-md .navbar-collapse{display:flex!important;flex-basis:auto}.navbar-expand-md .navbar-toggler{display:none}}@media (max-width:991.98px){.navbar-expand-lg>.container,.navbar-expand-lg>.container-fluid,.navbar-expand-lg>.container-lg,.navbar-expand-lg>.container-md,.navbar-expand-lg>.container-sm,.navbar-expand-lg>.container-xl{padding-right:0;padding-left:0}}@media (min-width:992px){.navbar-expand-lg{flex-flow:row nowrap;justify-content:flex-start}.navbar-expand-lg .navbar-nav{flex-direction:row}.navbar-expand-lg .navbar-nav .dropdown-menu{position:absolute}.navbar-expand-lg .navbar-nav .nav-link{padding-right:0;padding-left:0}.navbar-expand-lg>.container,.navbar-expand-lg>.container-fluid,.navbar-expand-lg>.container-lg,.navbar-expand-lg>.container-md,.navbar-expand-lg>.container-sm,.navbar-expand-lg>.container-xl{flex-wrap:nowrap}.navbar-expand-lg .navbar-collapse{display:flex!important;flex-basis:auto}.navbar-expand-lg .navbar-toggler{display:none}}@media (max-width:1199.98px){.navbar-expand-xl>.container,.navbar-expand-xl>.container-fluid,.navbar-expand-xl>.container-lg,.navbar-expand-xl>.container-md,.navbar-expand-xl>.container-sm,.navbar-expand-xl>.container-xl{padding-right:0;padding-left:0}}@media (min-width:1200px){.navbar-expand-xl{flex-flow:row nowrap;justify-content:flex-start}.navbar-expand-xl .navbar-nav{flex-direction:row}.navbar-expand-xl .navbar-nav .dropdown-menu{position:absolute}.navbar-expand-xl .navbar-nav .nav-link{padding-right:0;padding-left:0}.navbar-expand-xl>.container,.navbar-expand-xl>.container-fluid,.navbar-expand-xl>.container-lg,.navbar-expand-xl>.container-md,.navbar-expand-xl>.container-sm,.navbar-expand-xl>.container-xl{flex-wrap:nowrap}.navbar-expand-xl .navbar-collapse{display:flex!important;flex-basis:auto}.navbar-expand-xl .navbar-toggler{display:none}}.navbar-expand{flex-flow:row nowrap;justify-content:flex-start}.navbar-expand>.container,.navbar-expand>.container-fluid,.navbar-expand>.container-lg,.navbar-expand>.container-md,.navbar-expand>.container-sm,.navbar-expand>.container-xl{padding-right:0;padding-left:0}.navbar-expand .navbar-nav{flex-direction:row}.navbar-expand .navbar-nav .dropdown-menu{position:absolute}.navbar-expand .navbar-nav .nav-link{padding-right:0;padding-left:0}.navbar-expand>.container,.navbar-expand>.container-fluid,.navbar-expand>.container-lg,.navbar-expand>.container-md,.navbar-expand>.container-sm,.navbar-expand>.container-xl{flex-wrap:nowrap}.navbar-expand .navbar-collapse{display:flex!important;flex-basis:auto}.navbar-expand .navbar-toggler{display:none}.navbar-light .navbar-brand,.navbar-light .navbar-brand:focus,.navbar-light .navbar-brand:hover{color:rgba(0,0,0,.9)}.navbar-light .navbar-nav .nav-link{color:rgba(0,0,0,.5)}.navbar-light .navbar-nav .nav-link:focus,.navbar-light .navbar-nav .nav-link:hover{color:rgba(0,0,0,.7)}.navbar-light .navbar-nav .nav-link.disabled{color:rgba(0,0,0,.3)}.navbar-light .navbar-nav .active>.nav-link,.navbar-light .navbar-nav .nav-link.active,.navbar-light .navbar-nav .nav-link.show,.navbar-light .navbar-nav .show>.nav-link{color:rgba(0,0,0,.9)}.navbar-light .navbar-toggler{color:rgba(0,0,0,.5);border-color:rgba(0,0,0,.1)}.navbar-light .navbar-toggler-icon{background-image:url("data:image/svg+xml;charset=utf-8,%3Csvg xmlns='http://www.w3.org/2000/svg' width='30' height='30'%3E%3Cpath stroke='rgba(0, 0, 0, 0.5)' stroke-linecap='round' stroke-miterlimit='10' stroke-width='2' d='M4 7h22M4 15h22M4 23h22'/%3E%3C/svg%3E")}.navbar-light .navbar-text{color:rgba(0,0,0,.5)}.navbar-light .navbar-text a,.navbar-light .navbar-text a:focus,.navbar-light .navbar-text a:hover{color:rgba(0,0,0,.9)}.navbar-dark .navbar-brand,.navbar-dark .navbar-brand:focus,.navbar-dark .navbar-brand:hover{color:#fff}.navbar-dark .navbar-nav .nav-link{color:hsla(0,0%,100%,.7)}.navbar-dark .navbar-nav .nav-link:focus,.navbar-dark .navbar-nav .nav-link:hover{color:hsla(0,0%,100%,.75)}.navbar-dark .navbar-nav .nav-link.disabled{color:hsla(0,0%,100%,.25)}.navbar-dark .navbar-nav .active>.nav-link,.navbar-dark .navbar-nav .nav-link.active,.navbar-dark .navbar-nav .nav-link.show,.navbar-dark .navbar-nav .show>.nav-link{color:#fff}.navbar-dark .navbar-toggler{color:hsla(0,0%,100%,.7);border-color:hsla(0,0%,100%,.1)}.navbar-dark .navbar-toggler-icon{background-image:url("data:image/svg+xml;charset=utf-8,%3Csvg xmlns='http://www.w3.org/2000/svg' width='30' height='30'%3E%3Cpath stroke='rgba(255, 255, 255, 0.7)' stroke-linecap='round' stroke-miterlimit='10' stroke-width='2' d='M4 7h22M4 15h22M4 23h22'/%3E%3C/svg%3E")}.navbar-dark .navbar-text{color:hsla(0,0%,100%,.7)}.navbar-dark .navbar-text a,.navbar-dark .navbar-text a:focus,.navbar-dark .navbar-text a:hover{color:#fff}.nav{display:flex;flex-wrap:wrap;padding-left:0;margin-bottom:0;list-style:none}.nav-link{display:block;padding:0 1rem}.nav-link:focus,.nav-link:hover{text-decoration:none}.nav-link.disabled{color:#6c757d;pointer-events:none;cursor:default}.nav-tabs{border-bottom:1px solid #dee2e6}.nav-tabs .nav-item{margin-bottom:-1px}.nav-tabs .nav-link{border:1px solid transparent;border-top-left-radius:.25rem;border-top-right-radius:.25rem}.nav-tabs .nav-link:focus,.nav-tabs .nav-link:hover{border-color:#e9ecef #e9ecef #dee2e6}.nav-tabs .nav-link.disabled{color:#6c757d;background-color:transparent;border-color:transparent}.nav-tabs .nav-item.show .nav-link,.nav-tabs .nav-link.active{color:#495057;background-color:#eceeef;border-color:#dee2e6 #dee2e6 #eceeef}.nav-tabs .dropdown-menu{margin-top:-1px;border-top-left-radius:0;border-top-right-radius:0}.nav-pills .nav-link{border-radius:.25rem}.nav-pills .nav-link.active,.nav-pills .show>.nav-link{color:#fff;background-color:#007bff}.nav-fill .nav-item,.nav-fill>.nav-link{flex:1 1 auto;text-align:center}.nav-justified .nav-item,.nav-justified>.nav-link{flex-basis:0;flex-grow:1;text-align:center}.tab-content>.tab-pane{display:none}.tab-content>.active{display:block}.pbTable,.table{width:100%;margin-bottom:1rem;color:#797f90}.pbTable td,.pbTable th,.table td,.table th{padding:.75rem;vertical-align:top;border-top:1px solid #dddfe3}.pbTable thead th,.table thead th{vertical-align:bottom;border-bottom:2px solid #dddfe3}.pbTable tbody+tbody,.table tbody+tbody{border-top:2px solid #dddfe3}.table-sm td,.table-sm th{padding:.3rem}.pbTable,.pbTable td,.pbTable th,.table-bordered,.table-bordered td,.table-bordered th{border:1px solid #dddfe3}.pbTable thead td,.pbTable thead th,.table-bordered thead td,.table-bordered thead th{border-bottom-width:2px}.table-borderless tbody+tbody,.table-borderless td,.table-borderless th,.table-borderless thead th{border:0}.pbTable tbody tr:nth-of-type(odd),.table-striped tbody tr:nth-of-type(odd){background-color:#f8f9f9}.table-hover tbody tr:hover{color:#797f90;background-color:rgba(0,0,0,.075)}.table-primary,.table-primary>td,.table-primary>th{background-color:#b8daff}.table-primary tbody+tbody,.table-primary td,.table-primary th,.table-primary thead th{border-color:#7abaff}.table-hover .table-primary:hover,.table-hover .table-primary:hover>td,.table-hover .table-primary:hover>th{background-color:#9fcdff}.table-secondary,.table-secondary>td,.table-secondary>th{background-color:#d6d8db}.table-secondary tbody+tbody,.table-secondary td,.table-secondary th,.table-secondary thead th{border-color:#b3b7bb}.table-hover .table-secondary:hover,.table-hover .table-secondary:hover>td,.table-hover .table-secondary:hover>th{background-color:#c8cbcf}.table-success,.table-success>td,.table-success>th{background-color:#c3e6cb}.table-success tbody+tbody,.table-success td,.table-success th,.table-success thead th{border-color:#8fd19e}.table-hover .table-success:hover,.table-hover .table-success:hover>td,.table-hover .table-success:hover>th{background-color:#b1dfbb}.table-info,.table-info>td,.table-info>th{background-color:#bee5eb}.table-info tbody+tbody,.table-info td,.table-info th,.table-info thead th{border-color:#86cfda}.table-hover .table-info:hover,.table-hover .table-info:hover>td,.table-hover .table-info:hover>th{background-color:#abdde5}.table-warning,.table-warning>td,.table-warning>th{background-color:#ffeeba}.table-warning tbody+tbody,.table-warning td,.table-warning th,.table-warning thead th{border-color:#ffdf7e}.table-hover .table-warning:hover,.table-hover .table-warning:hover>td,.table-hover .table-warning:hover>th{background-color:#ffe8a1}.table-danger,.table-danger>td,.table-danger>th{background-color:#f5c6cb}.table-danger tbody+tbody,.table-danger td,.table-danger th,.table-danger thead th{border-color:#ed969e}.table-hover .table-danger:hover,.table-hover .table-danger:hover>td,.table-hover .table-danger:hover>th{background-color:#f1b0b7}.table-light,.table-light>td,.table-light>th{background-color:#fdfdfe}.table-light tbody+tbody,.table-light td,.table-light th,.table-light thead th{border-color:#fbfcfc}.table-hover .table-light:hover,.table-hover .table-light:hover>td,.table-hover .table-light:hover>th{background-color:#ececf6}.table-dark,.table-dark>td,.table-dark>th{background-color:#c6c8ca}.table-dark tbody+tbody,.table-dark td,.table-dark th,.table-dark thead th{border-color:#95999c}.table-hover .table-dark:hover,.table-hover .table-dark:hover>td,.table-hover .table-dark:hover>th{background-color:#b9bbbe}.table-active,.table-active>td,.table-active>th,.table-hover .table-active:hover,.table-hover .table-active:hover>td,.table-hover .table-active:hover>th{background-color:rgba(0,0,0,.075)}.pbTable .thead-dark th,.table .thead-dark th{color:#fff;background-color:#343a40;border-color:#454d55}.pbTable .thead-light th,.table .thead-light th{color:#495057;background-color:#e9ecef;border-color:#dddfe3}.table-dark{color:#fff;background-color:#343a40}.table-dark td,.table-dark th,.table-dark thead th{border-color:#454d55}.table-dark.pbTable,.table-dark.table-bordered{border:0}.table-dark.pbTable tbody tr:nth-of-type(odd),.table-dark.table-striped tbody tr:nth-of-type(odd){background-color:hsla(0,0%,100%,.05)}.table-dark.table-hover tbody tr:hover{color:#fff;background-color:hsla(0,0%,100%,.075)}@media (max-width:575.98px){.table-responsive-sm{display:block;width:100%;overflow-x:auto;-webkit-overflow-scrolling:touch}.table-responsive-sm>.pbTable,.table-responsive-sm>.table-bordered{border:0}}@media (max-width:767.98px){.table-responsive-md{display:block;width:100%;overflow-x:auto;-webkit-overflow-scrolling:touch}.table-responsive-md>.pbTable,.table-responsive-md>.table-bordered{border:0}}@media (max-width:991.98px){.table-responsive-lg{display:block;width:100%;overflow-x:auto;-webkit-overflow-scrolling:touch}.table-responsive-lg>.pbTable,.table-responsive-lg>.table-bordered{border:0}}@media (max-width:1199.98px){.table-responsive-xl{display:block;width:100%;overflow-x:auto;-webkit-overflow-scrolling:touch}.table-responsive-xl>.pbTable,.table-responsive-xl>.table-bordered{border:0}}.table-responsive{display:block;width:100%;overflow-x:auto;-webkit-overflow-scrolling:touch}.table-responsive>.pbTable,.table-responsive>.table-bordered{border:0}.card{position:relative;display:flex;flex-direction:column;min-width:0;word-wrap:break-word;background-color:#fff;background-clip:border-box;border:1px solid rgba(0,0,0,.125);border-radius:0}.card>hr{margin-right:0;margin-left:0}.card>.list-group{border-top:inherit;border-bottom:inherit}.card>.list-group:first-child{border-top-width:0;border-top-left-radius:0;border-top-right-radius:0}.card>.list-group:last-child{border-bottom-width:0;border-bottom-right-radius:0;border-bottom-left-radius:0}.card>.card-header+.list-group,.card>.list-group+.card-footer{border-top:0}.card-body{flex:1 1 auto;min-height:1px;padding:30px}.card-title{margin-bottom:.75rem}.card-subtitle{margin-top:-.375rem}.card-subtitle,.card-text:last-child{margin-bottom:0}.card-link:hover{text-decoration:none}.card-link+.card-link{margin-left:30px}.card-header{padding:.75rem 30px;margin-bottom:0;background-color:rgba(0,0,0,.03);border-bottom:1px solid rgba(0,0,0,.125)}.card-header:first-child{border-radius:0 0 0 0}.card-footer{padding:.75rem 30px;background-color:rgba(0,0,0,.03);border-top:1px solid rgba(0,0,0,.125)}.card-footer:last-child{border-radius:0 0 0 0}.card-header-tabs{margin-bottom:-.75rem;border-bottom:0}.card-header-pills,.card-header-tabs{margin-right:-15px;margin-left:-15px}.card-img-overlay{position:absolute;top:0;right:0;bottom:0;left:0;padding:1.25rem;border-radius:0}.card-img,.card-img-bottom,.card-img-top{flex-shrink:0;width:100%}.card-img,.card-img-top{border-top-left-radius:0;border-top-right-radius:0}.card-img,.card-img-bottom{border-bottom-right-radius:0;border-bottom-left-radius:0}.card-deck .card{margin-bottom:10px}@media (min-width:576px){.card-deck{display:flex;flex-flow:row wrap;margin-right:-10px;margin-left:-10px}.card-deck .card{flex:1 0 0%;margin-right:10px;margin-bottom:0;margin-left:10px}}.card-group>.card{margin-bottom:10px}@media (min-width:576px){.card-group{display:flex;flex-flow:row wrap}.card-group>.card{flex:1 0 0%;margin-bottom:0}.card-group>.card+.card{margin-left:0;border-left:0}.card-group>.card:not(:last-child){border-top-right-radius:0;border-bottom-right-radius:0}.card-group>.card:not(:last-child) .card-header,.card-group>.card:not(:last-child) .card-img-top{border-top-right-radius:0}.card-group>.card:not(:last-child) .card-footer,.card-group>.card:not(:last-child) .card-img-bottom{border-bottom-right-radius:0}.card-group>.card:not(:first-child){border-top-left-radius:0;border-bottom-left-radius:0}.card-group>.card:not(:first-child) .card-header,.card-group>.card:not(:first-child) .card-img-top{border-top-left-radius:0}.card-group>.card:not(:first-child) .card-footer,.card-group>.card:not(:first-child) .card-img-bottom{border-bottom-left-radius:0}}.card-columns .card{margin-bottom:.75rem}@media (min-width:576px){.card-columns{-moz-column-count:3;column-count:3;-moz-column-gap:1.25rem;column-gap:1.25rem;orphans:1;widows:1}.card-columns .card{display:inline-block;width:100%}}.accordion{overflow-anchor:none}.accordion>.card{overflow:hidden}.accordion>.card:not(:last-of-type){border-bottom:0;border-bottom-right-radius:0;border-bottom-left-radius:0}.accordion>.card:not(:first-of-type){border-top-left-radius:0;border-top-right-radius:0}.accordion>.card>.card-header{border-radius:0;margin-bottom:-1px}code{font-size:87.5%;color:#e83e8c;word-wrap:break-word}a>code{color:inherit}kbd{padding:.2rem .4rem;font-size:87.5%;color:#fff;background-color:#212529;border-radius:.2rem}kbd kbd{padding:0;font-size:100%;font-weight:700}pre{display:block;font-size:87.5%;color:#212529}pre code{font-size:inherit;color:inherit;word-break:normal}.pre-scrollable{max-height:340px;overflow-y:scroll}.alert,.pb-alert{position:relative;padding:.75rem 1.25rem;margin-bottom:1rem;border:1px solid transparent;border-radius:.25rem}.alert-heading{color:inherit}.alert-link{font-weight:700}.alert-dismissible{padding-right:4rem}.alert-dismissible .close{position:absolute;top:0;right:0;z-index:2;padding:.75rem 1.25rem;color:inherit}.alert-primary{color:#004085;background-color:#cce5ff;border-color:#b8daff}.alert-primary hr{border-top-color:#9fcdff}.alert-primary .alert-link{color:#002752}.alert-secondary{color:#383d41;background-color:#e2e3e5;border-color:#d6d8db}.alert-secondary hr{border-top-color:#c8cbcf}.alert-secondary .alert-link{color:#202326}.alert-success{color:#155724;background-color:#d4edda;border-color:#c3e6cb}.alert-success hr{border-top-color:#b1dfbb}.alert-success .alert-link{color:#0b2e13}.alert-info,.pb-alert-tip{color:#0c5460;background-color:#d1ecf1;border-color:#bee5eb}.alert-info hr,.pb-alert-tip hr{border-top-color:#abdde5}.alert-info .alert-link,.pb-alert-tip .alert-link{color:#062c33}.alert-warning,.pb-alert-warning{color:#856404;background-color:#fff3cd;border-color:#ffeeba}.alert-warning hr,.pb-alert-warning hr{border-top-color:#ffe8a1}.alert-warning .alert-link,.pb-alert-warning .alert-link{color:#533f03}.alert-danger,.pb-alert-important{color:#721c24;background-color:#f8d7da;border-color:#f5c6cb}.alert-danger hr,.pb-alert-important hr{border-top-color:#f1b0b7}.alert-danger .alert-link,.pb-alert-important .alert-link{color:#491217}.alert-light{color:#818182;background-color:#fefefe;border-color:#fdfdfe}.alert-light hr{border-top-color:#ececf6}.alert-light .alert-link{color:#686868}.alert-dark{color:#1b1e21;background-color:#d6d8d9;border-color:#c6c8ca}.alert-dark hr{border-top-color:#b9bbbe}.alert-dark .alert-link{color:#040505}.modal-open{overflow:hidden}.modal-open .modal{overflow-x:hidden;overflow-y:auto}.modal{position:fixed;top:0;left:0;z-index:1050;display:none;width:100%;height:100%;overflow:hidden;outline:0}.modal-dialog{position:relative;width:auto;margin:.5rem;pointer-events:none}.modal.fade .modal-dialog{transition:transform .3s ease-out;transform:translateY(-50px)}@media (prefers-reduced-motion:reduce){.modal.fade .modal-dialog{transition:none}}.modal.show .modal-dialog{transform:none}.modal.modal-static .modal-dialog{transform:scale(1.02)}.modal-dialog-scrollable{display:flex;max-height:calc(100% - 1rem)}.modal-dialog-scrollable .modal-content{max-height:calc(100vh - 1rem);overflow:hidden}.modal-dialog-scrollable .modal-footer,.modal-dialog-scrollable .modal-header{flex-shrink:0}.modal-dialog-scrollable .modal-body{overflow-y:auto}.modal-dialog-centered{display:flex;align-items:center;min-height:calc(100% - 1rem)}.modal-dialog-centered:before{display:block;height:calc(100vh - 1rem);height:-webkit-min-content;height:-moz-min-content;height:min-content;content:""}.modal-dialog-centered.modal-dialog-scrollable{flex-direction:column;justify-content:center;height:100%}.modal-dialog-centered.modal-dialog-scrollable .modal-content{max-height:none}.modal-dialog-centered.modal-dialog-scrollable:before{content:none}.modal-content{position:relative;display:flex;flex-direction:column;width:100%;pointer-events:auto;background-color:#fff;background-clip:padding-box;border:1px solid rgba(0,0,0,.2);border-radius:.3rem;outline:0}.modal-backdrop{position:fixed;top:0;left:0;z-index:1040;width:100vw;height:100vh;background-color:#000}.modal-backdrop.fade{opacity:0}.modal-backdrop.show{opacity:.5}.modal-header{display:flex;align-items:flex-start;justify-content:space-between;padding:1rem;border-bottom:1px solid #dee2e6;border-top-left-radius:calc(.3rem - 1px);border-top-right-radius:calc(.3rem - 1px)}.modal-header .close{padding:1rem;margin:-1rem -1rem -1rem auto}.modal-title{margin-bottom:0;line-height:1.5}.modal-body{position:relative;flex:1 1 auto;padding:1rem}.modal-footer{display:flex;flex-wrap:wrap;align-items:center;justify-content:flex-end;padding:.75rem;border-top:1px solid #dee2e6;border-bottom-right-radius:calc(.3rem - 1px);border-bottom-left-radius:calc(.3rem - 1px)}.modal-footer>*{margin:.25rem}.modal-scrollbar-measure{position:absolute;top:-9999px;width:50px;height:50px;overflow:scroll}@media (min-width:576px){.modal-dialog{max-width:500px;margin:1.75rem auto}.modal-dialog-scrollable{max-height:calc(100% - 3.5rem)}.modal-dialog-scrollable .modal-content{max-height:calc(100vh - 3.5rem)}.modal-dialog-centered{min-height:calc(100% - 3.5rem)}.modal-dialog-centered:before{height:calc(100vh - 3.5rem);height:-webkit-min-content;height:-moz-min-content;height:min-content}.modal-sm{max-width:300px}}@media (min-width:992px){.modal-lg,.modal-xl{max-width:800px}}@media (min-width:1200px){.modal-xl{max-width:1140px}}.align-baseline{vertical-align:baseline!important}.align-top{vertical-align:top!important}.align-middle{vertical-align:middle!important}.align-bottom{vertical-align:bottom!important}.align-text-bottom{vertical-align:text-bottom!important}.align-text-top{vertical-align:text-top!important}.bg-primary{background-color:#007bff!important}a.bg-primary:focus,a.bg-primary:hover,button.bg-primary:focus,button.bg-primary:hover{background-color:#0062cc!important}.bg-secondary{background-color:#6c757d!important}a.bg-secondary:focus,a.bg-secondary:hover,button.bg-secondary:focus,button.bg-secondary:hover{background-color:#545b62!important}.bg-success{background-color:#28a745!important}a.bg-success:focus,a.bg-success:hover,button.bg-success:focus,button.bg-success:hover{background-color:#1e7e34!important}.bg-info{background-color:#17a2b8!important}a.bg-info:focus,a.bg-info:hover,button.bg-info:focus,button.bg-info:hover{background-color:#117a8b!important}.bg-warning{background-color:#ffc107!important}a.bg-warning:focus,a.bg-warning:hover,button.bg-warning:focus,button.bg-warning:hover{background-color:#d39e00!important}.bg-danger{background-color:#dc3545!important}a.bg-danger:focus,a.bg-danger:hover,button.bg-danger:focus,button.bg-danger:hover{background-color:#bd2130!important}.bg-light{background-color:#f8f9fa!important}a.bg-light:focus,a.bg-light:hover,button.bg-light:focus,button.bg-light:hover{background-color:#dae0e5!important}.bg-dark{background-color:#343a40!important}a.bg-dark:focus,a.bg-dark:hover,button.bg-dark:focus,button.bg-dark:hover{background-color:#1d2124!important}.bg-white{background-color:#fff!important}.bg-transparent{background-color:transparent!important}.border{border:1px solid #dee2e6!important}.border-top{border-top:1px solid #dee2e6!important}.border-right{border-right:1px solid #dee2e6!important}.border-bottom{border-bottom:1px solid #dee2e6!important}.border-left{border-left:1px solid #dee2e6!important}.border-0{border:0!important}.border-top-0{border-top:0!important}.border-right-0{border-right:0!important}.border-bottom-0{border-bottom:0!important}.border-left-0{border-left:0!important}.border-primary{border-color:#007bff!important}.border-secondary{border-color:#6c757d!important}.border-success{border-color:#28a745!important}.border-info{border-color:#17a2b8!important}.border-warning{border-color:#ffc107!important}.border-danger{border-color:#dc3545!important}.border-light{border-color:#f8f9fa!important}.border-dark{border-color:#343a40!important}.border-white{border-color:#fff!important}.rounded-sm{border-radius:.2rem!important}.rounded{border-radius:.25rem!important}.rounded-top{border-top-left-radius:.25rem!important}.rounded-right,.rounded-top{border-top-right-radius:.25rem!important}.rounded-bottom,.rounded-right{border-bottom-right-radius:.25rem!important}.rounded-bottom,.rounded-left{border-bottom-left-radius:.25rem!important}.rounded-left{border-top-left-radius:.25rem!important}.rounded-lg{border-radius:.3rem!important}.rounded-circle{border-radius:50%!important}.rounded-pill{border-radius:50rem!important}.rounded-0{border-radius:0!important}.clearfix:after{display:block;clear:both;content:""}.d-none{display:none!important}.d-inline{display:inline!important}.d-inline-block{display:inline-block!important}.d-block{display:block!important}.d-table{display:table!important}.d-table-row{display:table-row!important}.d-table-cell{display:table-cell!important}.d-flex{display:flex!important}.d-inline-flex{display:inline-flex!important}@media (min-width:576px){.d-sm-none{display:none!important}.d-sm-inline{display:inline!important}.d-sm-inline-block{display:inline-block!important}.d-sm-block{display:block!important}.d-sm-table{display:table!important}.d-sm-table-row{display:table-row!important}.d-sm-table-cell{display:table-cell!important}.d-sm-flex{display:flex!important}.d-sm-inline-flex{display:inline-flex!important}}@media (min-width:768px){.d-md-none{display:none!important}.d-md-inline{display:inline!important}.d-md-inline-block{display:inline-block!important}.d-md-block{display:block!important}.d-md-table{display:table!important}.d-md-table-row{display:table-row!important}.d-md-table-cell{display:table-cell!important}.d-md-flex{display:flex!important}.d-md-inline-flex{display:inline-flex!important}}@media (min-width:992px){.d-lg-none{display:none!important}.d-lg-inline{display:inline!important}.d-lg-inline-block{display:inline-block!important}.d-lg-block{display:block!important}.d-lg-table{display:table!important}.d-lg-table-row{display:table-row!important}.d-lg-table-cell{display:table-cell!important}.d-lg-flex{display:flex!important}.d-lg-inline-flex{display:inline-flex!important}}@media (min-width:1200px){.d-xl-none{display:none!important}.d-xl-inline{display:inline!important}.d-xl-inline-block{display:inline-block!important}.d-xl-block{display:block!important}.d-xl-table{display:table!important}.d-xl-table-row{display:table-row!important}.d-xl-table-cell{display:table-cell!important}.d-xl-flex{display:flex!important}.d-xl-inline-flex{display:inline-flex!important}}@media print{.d-print-none{display:none!important}.d-print-inline{display:inline!important}.d-print-inline-block{display:inline-block!important}.d-print-block{display:block!important}.d-print-table{display:table!important}.d-print-table-row{display:table-row!important}.d-print-table-cell{display:table-cell!important}.d-print-flex{display:flex!important}.d-print-inline-flex{display:inline-flex!important}}.embed-responsive{position:relative;display:block;width:100%;padding:0;overflow:hidden}.embed-responsive:before{display:block;content:""}.embed-responsive .embed-responsive-item,.embed-responsive embed,.embed-responsive iframe,.embed-responsive object,.embed-responsive video{position:absolute;top:0;bottom:0;left:0;width:100%;height:100%;border:0}.embed-responsive-21by9:before{padding-top:42.8571428571%}.embed-responsive-16by9:before{padding-top:56.25%}.embed-responsive-4by3:before{padding-top:75%}.embed-responsive-1by1:before{padding-top:100%}.flex-row{flex-direction:row!important}.flex-column{flex-direction:column!important}.flex-row-reverse{flex-direction:row-reverse!important}.flex-column-reverse{flex-direction:column-reverse!important}.flex-wrap{flex-wrap:wrap!important}.flex-nowrap{flex-wrap:nowrap!important}.flex-wrap-reverse{flex-wrap:wrap-reverse!important}.flex-fill{flex:1 1 auto!important}.flex-grow-0{flex-grow:0!important}.flex-grow-1{flex-grow:1!important}.flex-shrink-0{flex-shrink:0!important}.flex-shrink-1{flex-shrink:1!important}.justify-content-start{justify-content:flex-start!important}.justify-content-end{justify-content:flex-end!important}.justify-content-center{justify-content:center!important}.justify-content-between{justify-content:space-between!important}.justify-content-around{justify-content:space-around!important}.align-items-start{align-items:flex-start!important}.align-items-end{align-items:flex-end!important}.align-items-center{align-items:center!important}.align-items-baseline{align-items:baseline!important}.align-items-stretch{align-items:stretch!important}.align-content-start{align-content:flex-start!important}.align-content-end{align-content:flex-end!important}.align-content-center{align-content:center!important}.align-content-between{align-content:space-between!important}.align-content-around{align-content:space-around!important}.align-content-stretch{align-content:stretch!important}.align-self-auto{align-self:auto!important}.align-self-start{align-self:flex-start!important}.align-self-end{align-self:flex-end!important}.align-self-center{align-self:center!important}.align-self-baseline{align-self:baseline!important}.align-self-stretch{align-self:stretch!important}@media (min-width:576px){.flex-sm-row{flex-direction:row!important}.flex-sm-column{flex-direction:column!important}.flex-sm-row-reverse{flex-direction:row-reverse!important}.flex-sm-column-reverse{flex-direction:column-reverse!important}.flex-sm-wrap{flex-wrap:wrap!important}.flex-sm-nowrap{flex-wrap:nowrap!important}.flex-sm-wrap-reverse{flex-wrap:wrap-reverse!important}.flex-sm-fill{flex:1 1 auto!important}.flex-sm-grow-0{flex-grow:0!important}.flex-sm-grow-1{flex-grow:1!important}.flex-sm-shrink-0{flex-shrink:0!important}.flex-sm-shrink-1{flex-shrink:1!important}.justify-content-sm-start{justify-content:flex-start!important}.justify-content-sm-end{justify-content:flex-end!important}.justify-content-sm-center{justify-content:center!important}.justify-content-sm-between{justify-content:space-between!important}.justify-content-sm-around{justify-content:space-around!important}.align-items-sm-start{align-items:flex-start!important}.align-items-sm-end{align-items:flex-end!important}.align-items-sm-center{align-items:center!important}.align-items-sm-baseline{align-items:baseline!important}.align-items-sm-stretch{align-items:stretch!important}.align-content-sm-start{align-content:flex-start!important}.align-content-sm-end{align-content:flex-end!important}.align-content-sm-center{align-content:center!important}.align-content-sm-between{align-content:space-between!important}.align-content-sm-around{align-content:space-around!important}.align-content-sm-stretch{align-content:stretch!important}.align-self-sm-auto{align-self:auto!important}.align-self-sm-start{align-self:flex-start!important}.align-self-sm-end{align-self:flex-end!important}.align-self-sm-center{align-self:center!important}.align-self-sm-baseline{align-self:baseline!important}.align-self-sm-stretch{align-self:stretch!important}}@media (min-width:768px){.flex-md-row{flex-direction:row!important}.flex-md-column{flex-direction:column!important}.flex-md-row-reverse{flex-direction:row-reverse!important}.flex-md-column-reverse{flex-direction:column-reverse!important}.flex-md-wrap{flex-wrap:wrap!important}.flex-md-nowrap{flex-wrap:nowrap!important}.flex-md-wrap-reverse{flex-wrap:wrap-reverse!important}.flex-md-fill{flex:1 1 auto!important}.flex-md-grow-0{flex-grow:0!important}.flex-md-grow-1{flex-grow:1!important}.flex-md-shrink-0{flex-shrink:0!important}.flex-md-shrink-1{flex-shrink:1!important}.justify-content-md-start{justify-content:flex-start!important}.justify-content-md-end{justify-content:flex-end!important}.justify-content-md-center{justify-content:center!important}.justify-content-md-between{justify-content:space-between!important}.justify-content-md-around{justify-content:space-around!important}.align-items-md-start{align-items:flex-start!important}.align-items-md-end{align-items:flex-end!important}.align-items-md-center{align-items:center!important}.align-items-md-baseline{align-items:baseline!important}.align-items-md-stretch{align-items:stretch!important}.align-content-md-start{align-content:flex-start!important}.align-content-md-end{align-content:flex-end!important}.align-content-md-center{align-content:center!important}.align-content-md-between{align-content:space-between!important}.align-content-md-around{align-content:space-around!important}.align-content-md-stretch{align-content:stretch!important}.align-self-md-auto{align-self:auto!important}.align-self-md-start{align-self:flex-start!important}.align-self-md-end{align-self:flex-end!important}.align-self-md-center{align-self:center!important}.align-self-md-baseline{align-self:baseline!important}.align-self-md-stretch{align-self:stretch!important}}@media (min-width:992px){.flex-lg-row{flex-direction:row!important}.flex-lg-column{flex-direction:column!important}.flex-lg-row-reverse{flex-direction:row-reverse!important}.flex-lg-column-reverse{flex-direction:column-reverse!important}.flex-lg-wrap{flex-wrap:wrap!important}.flex-lg-nowrap{flex-wrap:nowrap!important}.flex-lg-wrap-reverse{flex-wrap:wrap-reverse!important}.flex-lg-fill{flex:1 1 auto!important}.flex-lg-grow-0{flex-grow:0!important}.flex-lg-grow-1{flex-grow:1!important}.flex-lg-shrink-0{flex-shrink:0!important}.flex-lg-shrink-1{flex-shrink:1!important}.justify-content-lg-start{justify-content:flex-start!important}.justify-content-lg-end{justify-content:flex-end!important}.justify-content-lg-center{justify-content:center!important}.justify-content-lg-between{justify-content:space-between!important}.justify-content-lg-around{justify-content:space-around!important}.align-items-lg-start{align-items:flex-start!important}.align-items-lg-end{align-items:flex-end!important}.align-items-lg-center{align-items:center!important}.align-items-lg-baseline{align-items:baseline!important}.align-items-lg-stretch{align-items:stretch!important}.align-content-lg-start{align-content:flex-start!important}.align-content-lg-end{align-content:flex-end!important}.align-content-lg-center{align-content:center!important}.align-content-lg-between{align-content:space-between!important}.align-content-lg-around{align-content:space-around!important}.align-content-lg-stretch{align-content:stretch!important}.align-self-lg-auto{align-self:auto!important}.align-self-lg-start{align-self:flex-start!important}.align-self-lg-end{align-self:flex-end!important}.align-self-lg-center{align-self:center!important}.align-self-lg-baseline{align-self:baseline!important}.align-self-lg-stretch{align-self:stretch!important}}@media (min-width:1200px){.flex-xl-row{flex-direction:row!important}.flex-xl-column{flex-direction:column!important}.flex-xl-row-reverse{flex-direction:row-reverse!important}.flex-xl-column-reverse{flex-direction:column-reverse!important}.flex-xl-wrap{flex-wrap:wrap!important}.flex-xl-nowrap{flex-wrap:nowrap!important}.flex-xl-wrap-reverse{flex-wrap:wrap-reverse!important}.flex-xl-fill{flex:1 1 auto!important}.flex-xl-grow-0{flex-grow:0!important}.flex-xl-grow-1{flex-grow:1!important}.flex-xl-shrink-0{flex-shrink:0!important}.flex-xl-shrink-1{flex-shrink:1!important}.justify-content-xl-start{justify-content:flex-start!important}.justify-content-xl-end{justify-content:flex-end!important}.justify-content-xl-center{justify-content:center!important}.justify-content-xl-between{justify-content:space-between!important}.justify-content-xl-around{justify-content:space-around!important}.align-items-xl-start{align-items:flex-start!important}.align-items-xl-end{align-items:flex-end!important}.align-items-xl-center{align-items:center!important}.align-items-xl-baseline{align-items:baseline!important}.align-items-xl-stretch{align-items:stretch!important}.align-content-xl-start{align-content:flex-start!important}.align-content-xl-end{align-content:flex-end!important}.align-content-xl-center{align-content:center!important}.align-content-xl-between{align-content:space-between!important}.align-content-xl-around{align-content:space-around!important}.align-content-xl-stretch{align-content:stretch!important}.align-self-xl-auto{align-self:auto!important}.align-self-xl-start{align-self:flex-start!important}.align-self-xl-end{align-self:flex-end!important}.align-self-xl-center{align-self:center!important}.align-self-xl-baseline{align-self:baseline!important}.align-self-xl-stretch{align-self:stretch!important}}.float-left{float:left!important}.float-right{float:right!important}.float-none{float:none!important}@media (min-width:576px){.float-sm-left{float:left!important}.float-sm-right{float:right!important}.float-sm-none{float:none!important}}@media (min-width:768px){.float-md-left{float:left!important}.float-md-right{float:right!important}.float-md-none{float:none!important}}@media (min-width:992px){.float-lg-left{float:left!important}.float-lg-right{float:right!important}.float-lg-none{float:none!important}}@media (min-width:1200px){.float-xl-left{float:left!important}.float-xl-right{float:right!important}.float-xl-none{float:none!important}}.user-select-all{-webkit-user-select:all!important;-moz-user-select:all!important;-ms-user-select:all!important;user-select:all!important}.user-select-auto{-webkit-user-select:auto!important;-moz-user-select:auto!important;-ms-user-select:auto!important;user-select:auto!important}.user-select-none{-webkit-user-select:none!important;-moz-user-select:none!important;-ms-user-select:none!important;user-select:none!important}.overflow-auto{overflow:auto!important}.overflow-hidden{overflow:hidden!important}.position-static{position:static!important}.position-relative{position:relative!important}.position-absolute{position:absolute!important}.position-fixed{position:fixed!important}.position-sticky{position:-webkit-sticky!important;position:sticky!important}.fixed-top{top:0}.fixed-bottom,.fixed-top{position:fixed;right:0;left:0;z-index:1030}.fixed-bottom{bottom:0}@supports ((position:-webkit-sticky) or (position:sticky)){.sticky-top{position:-webkit-sticky;position:sticky;top:0;z-index:1020}}.sr-only{position:absolute;width:1px;height:1px;padding:0;margin:-1px;overflow:hidden;clip:rect(0,0,0,0);white-space:nowrap;border:0}.sr-only-focusable:active,.sr-only-focusable:focus{position:static;width:auto;height:auto;overflow:visible;clip:auto;white-space:normal}.shadow-sm{box-shadow:0 .125rem .25rem rgba(0,0,0,.075)!important}.shadow{box-shadow:0 .5rem 1rem rgba(0,0,0,.15)!important}.shadow-lg{box-shadow:0 1rem 3rem rgba(0,0,0,.175)!important}.shadow-none{box-shadow:none!important}.w-25{width:25%!important}.w-50{width:50%!important}.w-75{width:75%!important}.w-100{width:100%!important}.w-auto{width:auto!important}.h-25{height:25%!important}.h-50{height:50%!important}.h-75{height:75%!important}.h-100{height:100%!important}.h-auto{height:auto!important}.mw-100{max-width:100%!important}.mh-100{max-height:100%!important}.min-vw-100{min-width:100vw!important}.min-vh-100{min-height:100vh!important}.vw-100{width:100vw!important}.vh-100{height:100vh!important}.m-0{margin:0!important}.mt-0,.my-0{margin-top:0!important}.mr-0,.mx-0{margin-right:0!important}.mb-0,.my-0{margin-bottom:0!important}.ml-0,.mx-0{margin-left:0!important}.m-1{margin:.25rem!important}.mt-1,.my-1{margin-top:.25rem!important}.mr-1,.mx-1{margin-right:.25rem!important}.mb-1,.my-1{margin-bottom:.25rem!important}.ml-1,.mx-1{margin-left:.25rem!important}.m-2{margin:.5rem!important}.mt-2,.my-2{margin-top:.5rem!important}.mr-2,.mx-2{margin-right:.5rem!important}.mb-2,.my-2{margin-bottom:.5rem!important}.ml-2,.mx-2{margin-left:.5rem!important}.m-3{margin:1rem!important}.mt-3,.my-3{margin-top:1rem!important}.mr-3,.mx-3{margin-right:1rem!important}.mb-3,.my-3{margin-bottom:1rem!important}.ml-3,.mx-3{margin-left:1rem!important}.m-4{margin:1.5rem!important}.mt-4,.my-4{margin-top:1.5rem!important}.mr-4,.mx-4{margin-right:1.5rem!important}.mb-4,.my-4{margin-bottom:1.5rem!important}.ml-4,.mx-4{margin-left:1.5rem!important}.m-5{margin:3rem!important}.mt-5,.my-5{margin-top:3rem!important}.mr-5,.mx-5{margin-right:3rem!important}.mb-5,.my-5{margin-bottom:3rem!important}.ml-5,.mx-5{margin-left:3rem!important}.m-6{margin:3.75rem!important}.mt-6,.my-6{margin-top:3.75rem!important}.mr-6,.mx-6{margin-right:3.75rem!important}.mb-6,.my-6{margin-bottom:3.75rem!important}.ml-6,.mx-6{margin-left:3.75rem!important}.m-7{margin:4.5rem!important}.mt-7,.my-7{margin-top:4.5rem!important}.mr-7,.mx-7{margin-right:4.5rem!important}.mb-7,.my-7{margin-bottom:4.5rem!important}.ml-7,.mx-7{margin-left:4.5rem!important}.m-8{margin:5rem!important}.mt-8,.my-8{margin-top:5rem!important}.mr-8,.mx-8{margin-right:5rem!important}.mb-8,.my-8{margin-bottom:5rem!important}.ml-8,.mx-8{margin-left:5rem!important}.p-0{padding:0!important}.pt-0,.py-0{padding-top:0!important}.pr-0,.px-0{padding-right:0!important}.pb-0,.py-0{padding-bottom:0!important}.pl-0,.px-0{padding-left:0!important}.p-1{padding:.25rem!important}.pt-1,.py-1{padding-top:.25rem!important}.pr-1,.px-1{padding-right:.25rem!important}.pb-1,.py-1{padding-bottom:.25rem!important}.pl-1,.px-1{padding-left:.25rem!important}.p-2{padding:.5rem!important}.pt-2,.py-2{padding-top:.5rem!important}.pr-2,.px-2{padding-right:.5rem!important}.pb-2,.py-2{padding-bottom:.5rem!important}.pl-2,.px-2{padding-left:.5rem!important}.p-3{padding:1rem!important}.pt-3,.py-3{padding-top:1rem!important}.pr-3,.px-3{padding-right:1rem!important}.pb-3,.py-3{padding-bottom:1rem!important}.pl-3,.px-3{padding-left:1rem!important}.p-4{padding:1.5rem!important}.pt-4,.py-4{padding-top:1.5rem!important}.pr-4,.px-4{padding-right:1.5rem!important}.pb-4,.py-4{padding-bottom:1.5rem!important}.pl-4,.px-4{padding-left:1.5rem!important}.p-5{padding:3rem!important}.pt-5,.py-5{padding-top:3rem!important}.pr-5,.px-5{padding-right:3rem!important}.pb-5,.py-5{padding-bottom:3rem!important}.pl-5,.px-5{padding-left:3rem!important}.p-6{padding:3.75rem!important}.pt-6,.py-6{padding-top:3.75rem!important}.pr-6,.px-6{padding-right:3.75rem!important}.pb-6,.py-6{padding-bottom:3.75rem!important}.pl-6,.px-6{padding-left:3.75rem!important}.p-7{padding:4.5rem!important}.pt-7,.py-7{padding-top:4.5rem!important}.pr-7,.px-7{padding-right:4.5rem!important}.pb-7,.py-7{padding-bottom:4.5rem!important}.pl-7,.px-7{padding-left:4.5rem!important}.p-8{padding:5rem!important}.pt-8,.py-8{padding-top:5rem!important}.pr-8,.px-8{padding-right:5rem!important}.pb-8,.py-8{padding-bottom:5rem!important}.pl-8,.px-8{padding-left:5rem!important}.m-n1{margin:-.25rem!important}.mt-n1,.my-n1{margin-top:-.25rem!important}.mr-n1,.mx-n1{margin-right:-.25rem!important}.mb-n1,.my-n1{margin-bottom:-.25rem!important}.ml-n1,.mx-n1{margin-left:-.25rem!important}.m-n2{margin:-.5rem!important}.mt-n2,.my-n2{margin-top:-.5rem!important}.mr-n2,.mx-n2{margin-right:-.5rem!important}.mb-n2,.my-n2{margin-bottom:-.5rem!important}.ml-n2,.mx-n2{margin-left:-.5rem!important}.m-n3{margin:-1rem!important}.mt-n3,.my-n3{margin-top:-1rem!important}.mr-n3,.mx-n3{margin-right:-1rem!important}.mb-n3,.my-n3{margin-bottom:-1rem!important}.ml-n3,.mx-n3{margin-left:-1rem!important}.m-n4{margin:-1.5rem!important}.mt-n4,.my-n4{margin-top:-1.5rem!important}.mr-n4,.mx-n4{margin-right:-1.5rem!important}.mb-n4,.my-n4{margin-bottom:-1.5rem!important}.ml-n4,.mx-n4{margin-left:-1.5rem!important}.m-n5{margin:-3rem!important}.mt-n5,.my-n5{margin-top:-3rem!important}.mr-n5,.mx-n5{margin-right:-3rem!important}.mb-n5,.my-n5{margin-bottom:-3rem!important}.ml-n5,.mx-n5{margin-left:-3rem!important}.m-n6{margin:-3.75rem!important}.mt-n6,.my-n6{margin-top:-3.75rem!important}.mr-n6,.mx-n6{margin-right:-3.75rem!important}.mb-n6,.my-n6{margin-bottom:-3.75rem!important}.ml-n6,.mx-n6{margin-left:-3.75rem!important}.m-n7{margin:-4.5rem!important}.mt-n7,.my-n7{margin-top:-4.5rem!important}.mr-n7,.mx-n7{margin-right:-4.5rem!important}.mb-n7,.my-n7{margin-bottom:-4.5rem!important}.ml-n7,.mx-n7{margin-left:-4.5rem!important}.m-n8{margin:-5rem!important}.mt-n8,.my-n8{margin-top:-5rem!important}.mr-n8,.mx-n8{margin-right:-5rem!important}.mb-n8,.my-n8{margin-bottom:-5rem!important}.ml-n8,.mx-n8{margin-left:-5rem!important}.m-auto{margin:auto!important}.mt-auto,.my-auto{margin-top:auto!important}.mr-auto,.mx-auto{margin-right:auto!important}.mb-auto,.my-auto{margin-bottom:auto!important}.ml-auto,.mx-auto{margin-left:auto!important}@media (min-width:576px){.m-sm-0{margin:0!important}.mt-sm-0,.my-sm-0{margin-top:0!important}.mr-sm-0,.mx-sm-0{margin-right:0!important}.mb-sm-0,.my-sm-0{margin-bottom:0!important}.ml-sm-0,.mx-sm-0{margin-left:0!important}.m-sm-1{margin:.25rem!important}.mt-sm-1,.my-sm-1{margin-top:.25rem!important}.mr-sm-1,.mx-sm-1{margin-right:.25rem!important}.mb-sm-1,.my-sm-1{margin-bottom:.25rem!important}.ml-sm-1,.mx-sm-1{margin-left:.25rem!important}.m-sm-2{margin:.5rem!important}.mt-sm-2,.my-sm-2{margin-top:.5rem!important}.mr-sm-2,.mx-sm-2{margin-right:.5rem!important}.mb-sm-2,.my-sm-2{margin-bottom:.5rem!important}.ml-sm-2,.mx-sm-2{margin-left:.5rem!important}.m-sm-3{margin:1rem!important}.mt-sm-3,.my-sm-3{margin-top:1rem!important}.mr-sm-3,.mx-sm-3{margin-right:1rem!important}.mb-sm-3,.my-sm-3{margin-bottom:1rem!important}.ml-sm-3,.mx-sm-3{margin-left:1rem!important}.m-sm-4{margin:1.5rem!important}.mt-sm-4,.my-sm-4{margin-top:1.5rem!important}.mr-sm-4,.mx-sm-4{margin-right:1.5rem!important}.mb-sm-4,.my-sm-4{margin-bottom:1.5rem!important}.ml-sm-4,.mx-sm-4{margin-left:1.5rem!important}.m-sm-5{margin:3rem!important}.mt-sm-5,.my-sm-5{margin-top:3rem!important}.mr-sm-5,.mx-sm-5{margin-right:3rem!important}.mb-sm-5,.my-sm-5{margin-bottom:3rem!important}.ml-sm-5,.mx-sm-5{margin-left:3rem!important}.m-sm-6{margin:3.75rem!important}.mt-sm-6,.my-sm-6{margin-top:3.75rem!important}.mr-sm-6,.mx-sm-6{margin-right:3.75rem!important}.mb-sm-6,.my-sm-6{margin-bottom:3.75rem!important}.ml-sm-6,.mx-sm-6{margin-left:3.75rem!important}.m-sm-7{margin:4.5rem!important}.mt-sm-7,.my-sm-7{margin-top:4.5rem!important}.mr-sm-7,.mx-sm-7{margin-right:4.5rem!important}.mb-sm-7,.my-sm-7{margin-bottom:4.5rem!important}.ml-sm-7,.mx-sm-7{margin-left:4.5rem!important}.m-sm-8{margin:5rem!important}.mt-sm-8,.my-sm-8{margin-top:5rem!important}.mr-sm-8,.mx-sm-8{margin-right:5rem!important}.mb-sm-8,.my-sm-8{margin-bottom:5rem!important}.ml-sm-8,.mx-sm-8{margin-left:5rem!important}.p-sm-0{padding:0!important}.pt-sm-0,.py-sm-0{padding-top:0!important}.pr-sm-0,.px-sm-0{padding-right:0!important}.pb-sm-0,.py-sm-0{padding-bottom:0!important}.pl-sm-0,.px-sm-0{padding-left:0!important}.p-sm-1{padding:.25rem!important}.pt-sm-1,.py-sm-1{padding-top:.25rem!important}.pr-sm-1,.px-sm-1{padding-right:.25rem!important}.pb-sm-1,.py-sm-1{padding-bottom:.25rem!important}.pl-sm-1,.px-sm-1{padding-left:.25rem!important}.p-sm-2{padding:.5rem!important}.pt-sm-2,.py-sm-2{padding-top:.5rem!important}.pr-sm-2,.px-sm-2{padding-right:.5rem!important}.pb-sm-2,.py-sm-2{padding-bottom:.5rem!important}.pl-sm-2,.px-sm-2{padding-left:.5rem!important}.p-sm-3{padding:1rem!important}.pt-sm-3,.py-sm-3{padding-top:1rem!important}.pr-sm-3,.px-sm-3{padding-right:1rem!important}.pb-sm-3,.py-sm-3{padding-bottom:1rem!important}.pl-sm-3,.px-sm-3{padding-left:1rem!important}.p-sm-4{padding:1.5rem!important}.pt-sm-4,.py-sm-4{padding-top:1.5rem!important}.pr-sm-4,.px-sm-4{padding-right:1.5rem!important}.pb-sm-4,.py-sm-4{padding-bottom:1.5rem!important}.pl-sm-4,.px-sm-4{padding-left:1.5rem!important}.p-sm-5{padding:3rem!important}.pt-sm-5,.py-sm-5{padding-top:3rem!important}.pr-sm-5,.px-sm-5{padding-right:3rem!important}.pb-sm-5,.py-sm-5{padding-bottom:3rem!important}.pl-sm-5,.px-sm-5{padding-left:3rem!important}.p-sm-6{padding:3.75rem!important}.pt-sm-6,.py-sm-6{padding-top:3.75rem!important}.pr-sm-6,.px-sm-6{padding-right:3.75rem!important}.pb-sm-6,.py-sm-6{padding-bottom:3.75rem!important}.pl-sm-6,.px-sm-6{padding-left:3.75rem!important}.p-sm-7{padding:4.5rem!important}.pt-sm-7,.py-sm-7{padding-top:4.5rem!important}.pr-sm-7,.px-sm-7{padding-right:4.5rem!important}.pb-sm-7,.py-sm-7{padding-bottom:4.5rem!important}.pl-sm-7,.px-sm-7{padding-left:4.5rem!important}.p-sm-8{padding:5rem!important}.pt-sm-8,.py-sm-8{padding-top:5rem!important}.pr-sm-8,.px-sm-8{padding-right:5rem!important}.pb-sm-8,.py-sm-8{padding-bottom:5rem!important}.pl-sm-8,.px-sm-8{padding-left:5rem!important}.m-sm-n1{margin:-.25rem!important}.mt-sm-n1,.my-sm-n1{margin-top:-.25rem!important}.mr-sm-n1,.mx-sm-n1{margin-right:-.25rem!important}.mb-sm-n1,.my-sm-n1{margin-bottom:-.25rem!important}.ml-sm-n1,.mx-sm-n1{margin-left:-.25rem!important}.m-sm-n2{margin:-.5rem!important}.mt-sm-n2,.my-sm-n2{margin-top:-.5rem!important}.mr-sm-n2,.mx-sm-n2{margin-right:-.5rem!important}.mb-sm-n2,.my-sm-n2{margin-bottom:-.5rem!important}.ml-sm-n2,.mx-sm-n2{margin-left:-.5rem!important}.m-sm-n3{margin:-1rem!important}.mt-sm-n3,.my-sm-n3{margin-top:-1rem!important}.mr-sm-n3,.mx-sm-n3{margin-right:-1rem!important}.mb-sm-n3,.my-sm-n3{margin-bottom:-1rem!important}.ml-sm-n3,.mx-sm-n3{margin-left:-1rem!important}.m-sm-n4{margin:-1.5rem!important}.mt-sm-n4,.my-sm-n4{margin-top:-1.5rem!important}.mr-sm-n4,.mx-sm-n4{margin-right:-1.5rem!important}.mb-sm-n4,.my-sm-n4{margin-bottom:-1.5rem!important}.ml-sm-n4,.mx-sm-n4{margin-left:-1.5rem!important}.m-sm-n5{margin:-3rem!important}.mt-sm-n5,.my-sm-n5{margin-top:-3rem!important}.mr-sm-n5,.mx-sm-n5{margin-right:-3rem!important}.mb-sm-n5,.my-sm-n5{margin-bottom:-3rem!important}.ml-sm-n5,.mx-sm-n5{margin-left:-3rem!important}.m-sm-n6{margin:-3.75rem!important}.mt-sm-n6,.my-sm-n6{margin-top:-3.75rem!important}.mr-sm-n6,.mx-sm-n6{margin-right:-3.75rem!important}.mb-sm-n6,.my-sm-n6{margin-bottom:-3.75rem!important}.ml-sm-n6,.mx-sm-n6{margin-left:-3.75rem!important}.m-sm-n7{margin:-4.5rem!important}.mt-sm-n7,.my-sm-n7{margin-top:-4.5rem!important}.mr-sm-n7,.mx-sm-n7{margin-right:-4.5rem!important}.mb-sm-n7,.my-sm-n7{margin-bottom:-4.5rem!important}.ml-sm-n7,.mx-sm-n7{margin-left:-4.5rem!important}.m-sm-n8{margin:-5rem!important}.mt-sm-n8,.my-sm-n8{margin-top:-5rem!important}.mr-sm-n8,.mx-sm-n8{margin-right:-5rem!important}.mb-sm-n8,.my-sm-n8{margin-bottom:-5rem!important}.ml-sm-n8,.mx-sm-n8{margin-left:-5rem!important}.m-sm-auto{margin:auto!important}.mt-sm-auto,.my-sm-auto{margin-top:auto!important}.mr-sm-auto,.mx-sm-auto{margin-right:auto!important}.mb-sm-auto,.my-sm-auto{margin-bottom:auto!important}.ml-sm-auto,.mx-sm-auto{margin-left:auto!important}}@media (min-width:768px){.m-md-0{margin:0!important}.mt-md-0,.my-md-0{margin-top:0!important}.mr-md-0,.mx-md-0{margin-right:0!important}.mb-md-0,.my-md-0{margin-bottom:0!important}.ml-md-0,.mx-md-0{margin-left:0!important}.m-md-1{margin:.25rem!important}.mt-md-1,.my-md-1{margin-top:.25rem!important}.mr-md-1,.mx-md-1{margin-right:.25rem!important}.mb-md-1,.my-md-1{margin-bottom:.25rem!important}.ml-md-1,.mx-md-1{margin-left:.25rem!important}.m-md-2{margin:.5rem!important}.mt-md-2,.my-md-2{margin-top:.5rem!important}.mr-md-2,.mx-md-2{margin-right:.5rem!important}.mb-md-2,.my-md-2{margin-bottom:.5rem!important}.ml-md-2,.mx-md-2{margin-left:.5rem!important}.m-md-3{margin:1rem!important}.mt-md-3,.my-md-3{margin-top:1rem!important}.mr-md-3,.mx-md-3{margin-right:1rem!important}.mb-md-3,.my-md-3{margin-bottom:1rem!important}.ml-md-3,.mx-md-3{margin-left:1rem!important}.m-md-4{margin:1.5rem!important}.mt-md-4,.my-md-4{margin-top:1.5rem!important}.mr-md-4,.mx-md-4{margin-right:1.5rem!important}.mb-md-4,.my-md-4{margin-bottom:1.5rem!important}.ml-md-4,.mx-md-4{margin-left:1.5rem!important}.m-md-5{margin:3rem!important}.mt-md-5,.my-md-5{margin-top:3rem!important}.mr-md-5,.mx-md-5{margin-right:3rem!important}.mb-md-5,.my-md-5{margin-bottom:3rem!important}.ml-md-5,.mx-md-5{margin-left:3rem!important}.m-md-6{margin:3.75rem!important}.mt-md-6,.my-md-6{margin-top:3.75rem!important}.mr-md-6,.mx-md-6{margin-right:3.75rem!important}.mb-md-6,.my-md-6{margin-bottom:3.75rem!important}.ml-md-6,.mx-md-6{margin-left:3.75rem!important}.m-md-7{margin:4.5rem!important}.mt-md-7,.my-md-7{margin-top:4.5rem!important}.mr-md-7,.mx-md-7{margin-right:4.5rem!important}.mb-md-7,.my-md-7{margin-bottom:4.5rem!important}.ml-md-7,.mx-md-7{margin-left:4.5rem!important}.m-md-8{margin:5rem!important}.mt-md-8,.my-md-8{margin-top:5rem!important}.mr-md-8,.mx-md-8{margin-right:5rem!important}.mb-md-8,.my-md-8{margin-bottom:5rem!important}.ml-md-8,.mx-md-8{margin-left:5rem!important}.p-md-0{padding:0!important}.pt-md-0,.py-md-0{padding-top:0!important}.pr-md-0,.px-md-0{padding-right:0!important}.pb-md-0,.py-md-0{padding-bottom:0!important}.pl-md-0,.px-md-0{padding-left:0!important}.p-md-1{padding:.25rem!important}.pt-md-1,.py-md-1{padding-top:.25rem!important}.pr-md-1,.px-md-1{padding-right:.25rem!important}.pb-md-1,.py-md-1{padding-bottom:.25rem!important}.pl-md-1,.px-md-1{padding-left:.25rem!important}.p-md-2{padding:.5rem!important}.pt-md-2,.py-md-2{padding-top:.5rem!important}.pr-md-2,.px-md-2{padding-right:.5rem!important}.pb-md-2,.py-md-2{padding-bottom:.5rem!important}.pl-md-2,.px-md-2{padding-left:.5rem!important}.p-md-3{padding:1rem!important}.pt-md-3,.py-md-3{padding-top:1rem!important}.pr-md-3,.px-md-3{padding-right:1rem!important}.pb-md-3,.py-md-3{padding-bottom:1rem!important}.pl-md-3,.px-md-3{padding-left:1rem!important}.p-md-4{padding:1.5rem!important}.pt-md-4,.py-md-4{padding-top:1.5rem!important}.pr-md-4,.px-md-4{padding-right:1.5rem!important}.pb-md-4,.py-md-4{padding-bottom:1.5rem!important}.pl-md-4,.px-md-4{padding-left:1.5rem!important}.p-md-5{padding:3rem!important}.pt-md-5,.py-md-5{padding-top:3rem!important}.pr-md-5,.px-md-5{padding-right:3rem!important}.pb-md-5,.py-md-5{padding-bottom:3rem!important}.pl-md-5,.px-md-5{padding-left:3rem!important}.p-md-6{padding:3.75rem!important}.pt-md-6,.py-md-6{padding-top:3.75rem!important}.pr-md-6,.px-md-6{padding-right:3.75rem!important}.pb-md-6,.py-md-6{padding-bottom:3.75rem!important}.pl-md-6,.px-md-6{padding-left:3.75rem!important}.p-md-7{padding:4.5rem!important}.pt-md-7,.py-md-7{padding-top:4.5rem!important}.pr-md-7,.px-md-7{padding-right:4.5rem!important}.pb-md-7,.py-md-7{padding-bottom:4.5rem!important}.pl-md-7,.px-md-7{padding-left:4.5rem!important}.p-md-8{padding:5rem!important}.pt-md-8,.py-md-8{padding-top:5rem!important}.pr-md-8,.px-md-8{padding-right:5rem!important}.pb-md-8,.py-md-8{padding-bottom:5rem!important}.pl-md-8,.px-md-8{padding-left:5rem!important}.m-md-n1{margin:-.25rem!important}.mt-md-n1,.my-md-n1{margin-top:-.25rem!important}.mr-md-n1,.mx-md-n1{margin-right:-.25rem!important}.mb-md-n1,.my-md-n1{margin-bottom:-.25rem!important}.ml-md-n1,.mx-md-n1{margin-left:-.25rem!important}.m-md-n2{margin:-.5rem!important}.mt-md-n2,.my-md-n2{margin-top:-.5rem!important}.mr-md-n2,.mx-md-n2{margin-right:-.5rem!important}.mb-md-n2,.my-md-n2{margin-bottom:-.5rem!important}.ml-md-n2,.mx-md-n2{margin-left:-.5rem!important}.m-md-n3{margin:-1rem!important}.mt-md-n3,.my-md-n3{margin-top:-1rem!important}.mr-md-n3,.mx-md-n3{margin-right:-1rem!important}.mb-md-n3,.my-md-n3{margin-bottom:-1rem!important}.ml-md-n3,.mx-md-n3{margin-left:-1rem!important}.m-md-n4{margin:-1.5rem!important}.mt-md-n4,.my-md-n4{margin-top:-1.5rem!important}.mr-md-n4,.mx-md-n4{margin-right:-1.5rem!important}.mb-md-n4,.my-md-n4{margin-bottom:-1.5rem!important}.ml-md-n4,.mx-md-n4{margin-left:-1.5rem!important}.m-md-n5{margin:-3rem!important}.mt-md-n5,.my-md-n5{margin-top:-3rem!important}.mr-md-n5,.mx-md-n5{margin-right:-3rem!important}.mb-md-n5,.my-md-n5{margin-bottom:-3rem!important}.ml-md-n5,.mx-md-n5{margin-left:-3rem!important}.m-md-n6{margin:-3.75rem!important}.mt-md-n6,.my-md-n6{margin-top:-3.75rem!important}.mr-md-n6,.mx-md-n6{margin-right:-3.75rem!important}.mb-md-n6,.my-md-n6{margin-bottom:-3.75rem!important}.ml-md-n6,.mx-md-n6{margin-left:-3.75rem!important}.m-md-n7{margin:-4.5rem!important}.mt-md-n7,.my-md-n7{margin-top:-4.5rem!important}.mr-md-n7,.mx-md-n7{margin-right:-4.5rem!important}.mb-md-n7,.my-md-n7{margin-bottom:-4.5rem!important}.ml-md-n7,.mx-md-n7{margin-left:-4.5rem!important}.m-md-n8{margin:-5rem!important}.mt-md-n8,.my-md-n8{margin-top:-5rem!important}.mr-md-n8,.mx-md-n8{margin-right:-5rem!important}.mb-md-n8,.my-md-n8{margin-bottom:-5rem!important}.ml-md-n8,.mx-md-n8{margin-left:-5rem!important}.m-md-auto{margin:auto!important}.mt-md-auto,.my-md-auto{margin-top:auto!important}.mr-md-auto,.mx-md-auto{margin-right:auto!important}.mb-md-auto,.my-md-auto{margin-bottom:auto!important}.ml-md-auto,.mx-md-auto{margin-left:auto!important}}@media (min-width:992px){.m-lg-0{margin:0!important}.mt-lg-0,.my-lg-0{margin-top:0!important}.mr-lg-0,.mx-lg-0{margin-right:0!important}.mb-lg-0,.my-lg-0{margin-bottom:0!important}.ml-lg-0,.mx-lg-0{margin-left:0!important}.m-lg-1{margin:.25rem!important}.mt-lg-1,.my-lg-1{margin-top:.25rem!important}.mr-lg-1,.mx-lg-1{margin-right:.25rem!important}.mb-lg-1,.my-lg-1{margin-bottom:.25rem!important}.ml-lg-1,.mx-lg-1{margin-left:.25rem!important}.m-lg-2{margin:.5rem!important}.mt-lg-2,.my-lg-2{margin-top:.5rem!important}.mr-lg-2,.mx-lg-2{margin-right:.5rem!important}.mb-lg-2,.my-lg-2{margin-bottom:.5rem!important}.ml-lg-2,.mx-lg-2{margin-left:.5rem!important}.m-lg-3{margin:1rem!important}.mt-lg-3,.my-lg-3{margin-top:1rem!important}.mr-lg-3,.mx-lg-3{margin-right:1rem!important}.mb-lg-3,.my-lg-3{margin-bottom:1rem!important}.ml-lg-3,.mx-lg-3{margin-left:1rem!important}.m-lg-4{margin:1.5rem!important}.mt-lg-4,.my-lg-4{margin-top:1.5rem!important}.mr-lg-4,.mx-lg-4{margin-right:1.5rem!important}.mb-lg-4,.my-lg-4{margin-bottom:1.5rem!important}.ml-lg-4,.mx-lg-4{margin-left:1.5rem!important}.m-lg-5{margin:3rem!important}.mt-lg-5,.my-lg-5{margin-top:3rem!important}.mr-lg-5,.mx-lg-5{margin-right:3rem!important}.mb-lg-5,.my-lg-5{margin-bottom:3rem!important}.ml-lg-5,.mx-lg-5{margin-left:3rem!important}.m-lg-6{margin:3.75rem!important}.mt-lg-6,.my-lg-6{margin-top:3.75rem!important}.mr-lg-6,.mx-lg-6{margin-right:3.75rem!important}.mb-lg-6,.my-lg-6{margin-bottom:3.75rem!important}.ml-lg-6,.mx-lg-6{margin-left:3.75rem!important}.m-lg-7{margin:4.5rem!important}.mt-lg-7,.my-lg-7{margin-top:4.5rem!important}.mr-lg-7,.mx-lg-7{margin-right:4.5rem!important}.mb-lg-7,.my-lg-7{margin-bottom:4.5rem!important}.ml-lg-7,.mx-lg-7{margin-left:4.5rem!important}.m-lg-8{margin:5rem!important}.mt-lg-8,.my-lg-8{margin-top:5rem!important}.mr-lg-8,.mx-lg-8{margin-right:5rem!important}.mb-lg-8,.my-lg-8{margin-bottom:5rem!important}.ml-lg-8,.mx-lg-8{margin-left:5rem!important}.p-lg-0{padding:0!important}.pt-lg-0,.py-lg-0{padding-top:0!important}.pr-lg-0,.px-lg-0{padding-right:0!important}.pb-lg-0,.py-lg-0{padding-bottom:0!important}.pl-lg-0,.px-lg-0{padding-left:0!important}.p-lg-1{padding:.25rem!important}.pt-lg-1,.py-lg-1{padding-top:.25rem!important}.pr-lg-1,.px-lg-1{padding-right:.25rem!important}.pb-lg-1,.py-lg-1{padding-bottom:.25rem!important}.pl-lg-1,.px-lg-1{padding-left:.25rem!important}.p-lg-2{padding:.5rem!important}.pt-lg-2,.py-lg-2{padding-top:.5rem!important}.pr-lg-2,.px-lg-2{padding-right:.5rem!important}.pb-lg-2,.py-lg-2{padding-bottom:.5rem!important}.pl-lg-2,.px-lg-2{padding-left:.5rem!important}.p-lg-3{padding:1rem!important}.pt-lg-3,.py-lg-3{padding-top:1rem!important}.pr-lg-3,.px-lg-3{padding-right:1rem!important}.pb-lg-3,.py-lg-3{padding-bottom:1rem!important}.pl-lg-3,.px-lg-3{padding-left:1rem!important}.p-lg-4{padding:1.5rem!important}.pt-lg-4,.py-lg-4{padding-top:1.5rem!important}.pr-lg-4,.px-lg-4{padding-right:1.5rem!important}.pb-lg-4,.py-lg-4{padding-bottom:1.5rem!important}.pl-lg-4,.px-lg-4{padding-left:1.5rem!important}.p-lg-5{padding:3rem!important}.pt-lg-5,.py-lg-5{padding-top:3rem!important}.pr-lg-5,.px-lg-5{padding-right:3rem!important}.pb-lg-5,.py-lg-5{padding-bottom:3rem!important}.pl-lg-5,.px-lg-5{padding-left:3rem!important}.p-lg-6{padding:3.75rem!important}.pt-lg-6,.py-lg-6{padding-top:3.75rem!important}.pr-lg-6,.px-lg-6{padding-right:3.75rem!important}.pb-lg-6,.py-lg-6{padding-bottom:3.75rem!important}.pl-lg-6,.px-lg-6{padding-left:3.75rem!important}.p-lg-7{padding:4.5rem!important}.pt-lg-7,.py-lg-7{padding-top:4.5rem!important}.pr-lg-7,.px-lg-7{padding-right:4.5rem!important}.pb-lg-7,.py-lg-7{padding-bottom:4.5rem!important}.pl-lg-7,.px-lg-7{padding-left:4.5rem!important}.p-lg-8{padding:5rem!important}.pt-lg-8,.py-lg-8{padding-top:5rem!important}.pr-lg-8,.px-lg-8{padding-right:5rem!important}.pb-lg-8,.py-lg-8{padding-bottom:5rem!important}.pl-lg-8,.px-lg-8{padding-left:5rem!important}.m-lg-n1{margin:-.25rem!important}.mt-lg-n1,.my-lg-n1{margin-top:-.25rem!important}.mr-lg-n1,.mx-lg-n1{margin-right:-.25rem!important}.mb-lg-n1,.my-lg-n1{margin-bottom:-.25rem!important}.ml-lg-n1,.mx-lg-n1{margin-left:-.25rem!important}.m-lg-n2{margin:-.5rem!important}.mt-lg-n2,.my-lg-n2{margin-top:-.5rem!important}.mr-lg-n2,.mx-lg-n2{margin-right:-.5rem!important}.mb-lg-n2,.my-lg-n2{margin-bottom:-.5rem!important}.ml-lg-n2,.mx-lg-n2{margin-left:-.5rem!important}.m-lg-n3{margin:-1rem!important}.mt-lg-n3,.my-lg-n3{margin-top:-1rem!important}.mr-lg-n3,.mx-lg-n3{margin-right:-1rem!important}.mb-lg-n3,.my-lg-n3{margin-bottom:-1rem!important}.ml-lg-n3,.mx-lg-n3{margin-left:-1rem!important}.m-lg-n4{margin:-1.5rem!important}.mt-lg-n4,.my-lg-n4{margin-top:-1.5rem!important}.mr-lg-n4,.mx-lg-n4{margin-right:-1.5rem!important}.mb-lg-n4,.my-lg-n4{margin-bottom:-1.5rem!important}.ml-lg-n4,.mx-lg-n4{margin-left:-1.5rem!important}.m-lg-n5{margin:-3rem!important}.mt-lg-n5,.my-lg-n5{margin-top:-3rem!important}.mr-lg-n5,.mx-lg-n5{margin-right:-3rem!important}.mb-lg-n5,.my-lg-n5{margin-bottom:-3rem!important}.ml-lg-n5,.mx-lg-n5{margin-left:-3rem!important}.m-lg-n6{margin:-3.75rem!important}.mt-lg-n6,.my-lg-n6{margin-top:-3.75rem!important}.mr-lg-n6,.mx-lg-n6{margin-right:-3.75rem!important}.mb-lg-n6,.my-lg-n6{margin-bottom:-3.75rem!important}.ml-lg-n6,.mx-lg-n6{margin-left:-3.75rem!important}.m-lg-n7{margin:-4.5rem!important}.mt-lg-n7,.my-lg-n7{margin-top:-4.5rem!important}.mr-lg-n7,.mx-lg-n7{margin-right:-4.5rem!important}.mb-lg-n7,.my-lg-n7{margin-bottom:-4.5rem!important}.ml-lg-n7,.mx-lg-n7{margin-left:-4.5rem!important}.m-lg-n8{margin:-5rem!important}.mt-lg-n8,.my-lg-n8{margin-top:-5rem!important}.mr-lg-n8,.mx-lg-n8{margin-right:-5rem!important}.mb-lg-n8,.my-lg-n8{margin-bottom:-5rem!important}.ml-lg-n8,.mx-lg-n8{margin-left:-5rem!important}.m-lg-auto{margin:auto!important}.mt-lg-auto,.my-lg-auto{margin-top:auto!important}.mr-lg-auto,.mx-lg-auto{margin-right:auto!important}.mb-lg-auto,.my-lg-auto{margin-bottom:auto!important}.ml-lg-auto,.mx-lg-auto{margin-left:auto!important}}@media (min-width:1200px){.m-xl-0{margin:0!important}.mt-xl-0,.my-xl-0{margin-top:0!important}.mr-xl-0,.mx-xl-0{margin-right:0!important}.mb-xl-0,.my-xl-0{margin-bottom:0!important}.ml-xl-0,.mx-xl-0{margin-left:0!important}.m-xl-1{margin:.25rem!important}.mt-xl-1,.my-xl-1{margin-top:.25rem!important}.mr-xl-1,.mx-xl-1{margin-right:.25rem!important}.mb-xl-1,.my-xl-1{margin-bottom:.25rem!important}.ml-xl-1,.mx-xl-1{margin-left:.25rem!important}.m-xl-2{margin:.5rem!important}.mt-xl-2,.my-xl-2{margin-top:.5rem!important}.mr-xl-2,.mx-xl-2{margin-right:.5rem!important}.mb-xl-2,.my-xl-2{margin-bottom:.5rem!important}.ml-xl-2,.mx-xl-2{margin-left:.5rem!important}.m-xl-3{margin:1rem!important}.mt-xl-3,.my-xl-3{margin-top:1rem!important}.mr-xl-3,.mx-xl-3{margin-right:1rem!important}.mb-xl-3,.my-xl-3{margin-bottom:1rem!important}.ml-xl-3,.mx-xl-3{margin-left:1rem!important}.m-xl-4{margin:1.5rem!important}.mt-xl-4,.my-xl-4{margin-top:1.5rem!important}.mr-xl-4,.mx-xl-4{margin-right:1.5rem!important}.mb-xl-4,.my-xl-4{margin-bottom:1.5rem!important}.ml-xl-4,.mx-xl-4{margin-left:1.5rem!important}.m-xl-5{margin:3rem!important}.mt-xl-5,.my-xl-5{margin-top:3rem!important}.mr-xl-5,.mx-xl-5{margin-right:3rem!important}.mb-xl-5,.my-xl-5{margin-bottom:3rem!important}.ml-xl-5,.mx-xl-5{margin-left:3rem!important}.m-xl-6{margin:3.75rem!important}.mt-xl-6,.my-xl-6{margin-top:3.75rem!important}.mr-xl-6,.mx-xl-6{margin-right:3.75rem!important}.mb-xl-6,.my-xl-6{margin-bottom:3.75rem!important}.ml-xl-6,.mx-xl-6{margin-left:3.75rem!important}.m-xl-7{margin:4.5rem!important}.mt-xl-7,.my-xl-7{margin-top:4.5rem!important}.mr-xl-7,.mx-xl-7{margin-right:4.5rem!important}.mb-xl-7,.my-xl-7{margin-bottom:4.5rem!important}.ml-xl-7,.mx-xl-7{margin-left:4.5rem!important}.m-xl-8{margin:5rem!important}.mt-xl-8,.my-xl-8{margin-top:5rem!important}.mr-xl-8,.mx-xl-8{margin-right:5rem!important}.mb-xl-8,.my-xl-8{margin-bottom:5rem!important}.ml-xl-8,.mx-xl-8{margin-left:5rem!important}.p-xl-0{padding:0!important}.pt-xl-0,.py-xl-0{padding-top:0!important}.pr-xl-0,.px-xl-0{padding-right:0!important}.pb-xl-0,.py-xl-0{padding-bottom:0!important}.pl-xl-0,.px-xl-0{padding-left:0!important}.p-xl-1{padding:.25rem!important}.pt-xl-1,.py-xl-1{padding-top:.25rem!important}.pr-xl-1,.px-xl-1{padding-right:.25rem!important}.pb-xl-1,.py-xl-1{padding-bottom:.25rem!important}.pl-xl-1,.px-xl-1{padding-left:.25rem!important}.p-xl-2{padding:.5rem!important}.pt-xl-2,.py-xl-2{padding-top:.5rem!important}.pr-xl-2,.px-xl-2{padding-right:.5rem!important}.pb-xl-2,.py-xl-2{padding-bottom:.5rem!important}.pl-xl-2,.px-xl-2{padding-left:.5rem!important}.p-xl-3{padding:1rem!important}.pt-xl-3,.py-xl-3{padding-top:1rem!important}.pr-xl-3,.px-xl-3{padding-right:1rem!important}.pb-xl-3,.py-xl-3{padding-bottom:1rem!important}.pl-xl-3,.px-xl-3{padding-left:1rem!important}.p-xl-4{padding:1.5rem!important}.pt-xl-4,.py-xl-4{padding-top:1.5rem!important}.pr-xl-4,.px-xl-4{padding-right:1.5rem!important}.pb-xl-4,.py-xl-4{padding-bottom:1.5rem!important}.pl-xl-4,.px-xl-4{padding-left:1.5rem!important}.p-xl-5{padding:3rem!important}.pt-xl-5,.py-xl-5{padding-top:3rem!important}.pr-xl-5,.px-xl-5{padding-right:3rem!important}.pb-xl-5,.py-xl-5{padding-bottom:3rem!important}.pl-xl-5,.px-xl-5{padding-left:3rem!important}.p-xl-6{padding:3.75rem!important}.pt-xl-6,.py-xl-6{padding-top:3.75rem!important}.pr-xl-6,.px-xl-6{padding-right:3.75rem!important}.pb-xl-6,.py-xl-6{padding-bottom:3.75rem!important}.pl-xl-6,.px-xl-6{padding-left:3.75rem!important}.p-xl-7{padding:4.5rem!important}.pt-xl-7,.py-xl-7{padding-top:4.5rem!important}.pr-xl-7,.px-xl-7{padding-right:4.5rem!important}.pb-xl-7,.py-xl-7{padding-bottom:4.5rem!important}.pl-xl-7,.px-xl-7{padding-left:4.5rem!important}.p-xl-8{padding:5rem!important}.pt-xl-8,.py-xl-8{padding-top:5rem!important}.pr-xl-8,.px-xl-8{padding-right:5rem!important}.pb-xl-8,.py-xl-8{padding-bottom:5rem!important}.pl-xl-8,.px-xl-8{padding-left:5rem!important}.m-xl-n1{margin:-.25rem!important}.mt-xl-n1,.my-xl-n1{margin-top:-.25rem!important}.mr-xl-n1,.mx-xl-n1{margin-right:-.25rem!important}.mb-xl-n1,.my-xl-n1{margin-bottom:-.25rem!important}.ml-xl-n1,.mx-xl-n1{margin-left:-.25rem!important}.m-xl-n2{margin:-.5rem!important}.mt-xl-n2,.my-xl-n2{margin-top:-.5rem!important}.mr-xl-n2,.mx-xl-n2{margin-right:-.5rem!important}.mb-xl-n2,.my-xl-n2{margin-bottom:-.5rem!important}.ml-xl-n2,.mx-xl-n2{margin-left:-.5rem!important}.m-xl-n3{margin:-1rem!important}.mt-xl-n3,.my-xl-n3{margin-top:-1rem!important}.mr-xl-n3,.mx-xl-n3{margin-right:-1rem!important}.mb-xl-n3,.my-xl-n3{margin-bottom:-1rem!important}.ml-xl-n3,.mx-xl-n3{margin-left:-1rem!important}.m-xl-n4{margin:-1.5rem!important}.mt-xl-n4,.my-xl-n4{margin-top:-1.5rem!important}.mr-xl-n4,.mx-xl-n4{margin-right:-1.5rem!important}.mb-xl-n4,.my-xl-n4{margin-bottom:-1.5rem!important}.ml-xl-n4,.mx-xl-n4{margin-left:-1.5rem!important}.m-xl-n5{margin:-3rem!important}.mt-xl-n5,.my-xl-n5{margin-top:-3rem!important}.mr-xl-n5,.mx-xl-n5{margin-right:-3rem!important}.mb-xl-n5,.my-xl-n5{margin-bottom:-3rem!important}.ml-xl-n5,.mx-xl-n5{margin-left:-3rem!important}.m-xl-n6{margin:-3.75rem!important}.mt-xl-n6,.my-xl-n6{margin-top:-3.75rem!important}.mr-xl-n6,.mx-xl-n6{margin-right:-3.75rem!important}.mb-xl-n6,.my-xl-n6{margin-bottom:-3.75rem!important}.ml-xl-n6,.mx-xl-n6{margin-left:-3.75rem!important}.m-xl-n7{margin:-4.5rem!important}.mt-xl-n7,.my-xl-n7{margin-top:-4.5rem!important}.mr-xl-n7,.mx-xl-n7{margin-right:-4.5rem!important}.mb-xl-n7,.my-xl-n7{margin-bottom:-4.5rem!important}.ml-xl-n7,.mx-xl-n7{margin-left:-4.5rem!important}.m-xl-n8{margin:-5rem!important}.mt-xl-n8,.my-xl-n8{margin-top:-5rem!important}.mr-xl-n8,.mx-xl-n8{margin-right:-5rem!important}.mb-xl-n8,.my-xl-n8{margin-bottom:-5rem!important}.ml-xl-n8,.mx-xl-n8{margin-left:-5rem!important}.m-xl-auto{margin:auto!important}.mt-xl-auto,.my-xl-auto{margin-top:auto!important}.mr-xl-auto,.mx-xl-auto{margin-right:auto!important}.mb-xl-auto,.my-xl-auto{margin-bottom:auto!important}.ml-xl-auto,.mx-xl-auto{margin-left:auto!important}}.stretched-link:after{position:absolute;top:0;right:0;bottom:0;left:0;z-index:1;pointer-events:auto;content:"";background-color:transparent}.text-monospace{font-family:SFMono-Regular,Menlo,Monaco,Consolas,Liberation Mono,Courier New,monospace!important}.text-justify{text-align:justify!important}.text-wrap{white-space:normal!important}.text-nowrap{white-space:nowrap!important}.text-truncate{overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.text-left{text-align:left!important}.text-right{text-align:right!important}.text-center{text-align:center!important}@media (min-width:576px){.text-sm-left{text-align:left!important}.text-sm-right{text-align:right!important}.text-sm-center{text-align:center!important}}@media (min-width:768px){.text-md-left{text-align:left!important}.text-md-right{text-align:right!important}.text-md-center{text-align:center!important}}@media (min-width:992px){.text-lg-left{text-align:left!important}.text-lg-right{text-align:right!important}.text-lg-center{text-align:center!important}}@media (min-width:1200px){.text-xl-left{text-align:left!important}.text-xl-right{text-align:right!important}.text-xl-center{text-align:center!important}}.text-lowercase{text-transform:lowercase!important}.text-uppercase{text-transform:uppercase!important}.text-capitalize{text-transform:capitalize!important}.font-weight-light{font-weight:300!important}.font-weight-lighter{font-weight:lighter!important}.font-weight-normal{font-weight:400!important}.font-weight-bold{font-weight:700!important}.font-weight-bolder{font-weight:bolder!important}.font-italic{font-style:italic!important}.text-white{color:#fff!important}.text-primary{color:#007bff!important}a.text-primary:focus,a.text-primary:hover{color:#0056b3!important}.text-secondary{color:#6c757d!important}a.text-secondary:focus,a.text-secondary:hover{color:#494f54!important}.text-success{color:#28a745!important}a.text-success:focus,a.text-success:hover{color:#19692c!important}.text-info{color:#17a2b8!important}a.text-info:focus,a.text-info:hover{color:#0f6674!important}.text-warning{color:#ffc107!important}a.text-warning:focus,a.text-warning:hover{color:#ba8b00!important}.text-danger{color:#dc3545!important}a.text-danger:focus,a.text-danger:hover{color:#a71d2a!important}.text-light{color:#f8f9fa!important}a.text-light:focus,a.text-light:hover{color:#cbd3da!important}.text-dark{color:#343a40!important}a.text-dark:focus,a.text-dark:hover{color:#121416!important}.text-body{color:#212529!important}.text-muted{color:#6c757d!important}.text-black-50{color:rgba(0,0,0,.5)!important}.text-white-50{color:hsla(0,0%,100%,.5)!important}.text-hide{font:0/0 a;color:transparent;text-shadow:none;background-color:transparent;border:0}.text-decoration-none{text-decoration:none!important}.text-break{word-break:break-word!important;word-wrap:break-word!important}.text-reset{color:inherit!important}.visible{visibility:visible!important}.invisible{visibility:hidden!important}.awesomplete>ul{background:#333;padding:0!important}.awesomplete>ul>li{padding:10px 15px;border-bottom:1px solid #707070;color:#efefef;font-size:17px}.awesomplete>ul>li:last-child{border-bottom:0}.awesomplete>ul>li[aria-selected=true]{background-color:#ff6f00}.awesomplete>ul>li:before{content:none!important}img{max-width:100%}div{min-width:0}body{color:#797f90;font-family:Arial,sans-serif;font-size:18px;line-height:1.5}@media (min-width:768px){body{font-size:18px}}.html__font-loaded--primary body{font-family:Open Sans,Arial,sans-serif}a{color:#ff6f00;text-decoration:underline}.h1,.h2,.h3,.h4,.h5,.h6,h1,h2,h3,h4,h5,h6{font-weight:600;color:#333}.typography-white .h1,.typography-white .h2,.typography-white .h3,.typography-white .h4,.typography-white .h5,.typography-white .h6,.typography-white h1,.typography-white h2,.typography-white h3,.typography-white h4,.typography-white h5,.typography-white h6{color:#fff}.h1.no-margin-top,.h2.no-margin-top,.h3.no-margin-top,.h4.no-margin-top,.h5.no-margin-top,.h6.no-margin-top,.no-margin-top .h1,.no-margin-top .h2,.no-margin-top .h3,.no-margin-top .h4,.no-margin-top .h5,.no-margin-top .h6,.no-margin-top h1,.no-margin-top h2,.no-margin-top h3,.no-margin-top h4,.no-margin-top h5,.no-margin-top h6,h1.no-margin-top,h2.no-margin-top,h3.no-margin-top,h4.no-margin-top,h5.no-margin-top,h6.no-margin-top{margin-top:0!important}.h1,h1{font-size:12vw;line-height:1.2}@media (min-width:410px){.h1,h1{font-size:42px}}@media (min-width:767px){.h1,h1{font-size:50px}}.h2,h2{font-size:36px;line-height:1.1}@media (min-width:768px){.h2,h2{font-size:40px}}.h3,h3{font-size:26px;line-height:1.1}@media (min-width:768px){.h3,h3{font-size:30px}}.h4,h4{font-size:22px}h5{font-size:20px}h6{font-size:18px}.pb-header .navbar{background:#333}@media (max-width:991px){.pb-header .navbar{padding-top:10px;padding-bottom:10px}}.pb-header .navbar-brand>img{display:block;max-width:140px;max-height:25px}.pb-header .dropdown-toggle:after{content:none}.pb-header .nav-item{padding-top:5px;padding-bottom:5px;margin-right:32px}.pb-header .nav-item:last-of-type{margin-right:0}@media (min-width:992px){.pb-header .nav-item{padding-top:34px;padding-bottom:24px}}.pb-header .nav-link{font-size:16px;text-decoration:none}@media (min-width:992px){.pb-header .nav-link[aria-expanded=true]:after{position:absolute;bottom:0;left:50%;height:0;width:0;border-color:transparent transparent #fff;border-style:solid;border-width:0 5.5px 8px;transform:translateX(-50%) translateY(0);z-index:5;content:""}}.pb-header .dropdown-menu{box-shadow:10px 10px 30px rgba(0,0,0,.16);-moz-column-rule:1px solid #dddfe3;column-rule:1px solid #dddfe3;padding:10px 0}@media (min-width:992px){.pb-header .dropdown-menu{padding:24px 0}.pb-header .dropdown-menu--product{-moz-columns:3;column-count:3;left:50%;transform:translateX(-50%)}.pb-header .dropdown-menu--support{-moz-columns:2;column-count:2;left:50%;transform:translateX(-50%)}.pb-header .dropdown-menu--resources{right:0;left:auto}.pb-header .dropdown-menu .dropdown-section{-moz-column-break-inside:avoid;break-inside:avoid-column}}.pb-header .dropdown-item{font-size:15px;text-decoration:none}.pb-header .dropdown-item--heading{font-weight:600;color:#333}.pb-header .dropdown-item--heading:hover{color:#ff6f00}@media (max-width:991px){.sidebar{margin-bottom:20px}}.sidebar a{text-decoration:none}.sidebar .navbar-toggler{color:rgba(0,0,0,.5);border-color:rgba(0,0,0,.1)}.sidebar .navbar-toggler-icon{background-image:url("data:image/svg+xml;charset=utf-8,%3Csvg xmlns='http://www.w3.org/2000/svg' width='30' height='30'%3E%3Cpath stroke='rgba(0, 0, 0, 0.5)' stroke-linecap='round' stroke-miterlimit='10' stroke-width='2' d='M4 7h22M4 15h22M4 23h22'/%3E%3C/svg%3E")}.sidebar .collapse.is-active,.sidebar .list-group-item{display:block}.sidebar .list-group-item--level-0{position:relative;padding:9px 12px 11px 14px;border-top:1px solid #dddfe3;color:#797f90;font-size:20px}.sidebar .list-group-item--level-0:after{position:absolute;top:50%;right:12px;height:8px;width:15px;transform:translateY(-50%);background:url(/assets/images/icons/down-carrot-0.svg) no-repeat 0 0;content:""}.sidebar .list-group-item--level-0:last-of-type{border-bottom:1px solid #dddfe3}.sidebar .list-group-item--level-0>.pb-section-title{display:inline-block;padding-right:20px}.sidebar .list-group-item--level-0.is-active{background-color:#333;color:#fff}.sidebar .list-group-item--level-0.is-active:after{background-image:url(/assets/images/icons/up-carrot-0.svg)}.sidebar .list-group-item--level-0.is-active+.sidebar-submenu+.list-group-item{border-top:0}.sidebar .list-group-item--level-1{padding:8px 14px 9px;background-color:hsla(0,0%,100%,.25);border-bottom:1px solid #dddfe3;color:#797f90;font-size:18px}.sidebar .list-group-item--level-1.is-active{position:relative;color:#ff6f00}.sidebar .list-group-item--level-1.is-active:after{position:absolute;top:50%;right:15px;height:5px;width:10px;transform:translateY(-50%);background-image:url(/assets/images/icons/up-carrot-1.svg);background-repeat:no-repeat;background-position:0 0;content:""}.sidebar .list-group-item--level-1.is-active>.pb-section-subtitle{display:inline-block;padding-right:15px}.sidebar .list-group-item--level-1.is-active+.sidebar-submenu{background-color:hsla(0,0%,100%,.25)}.sidebar .list-group-item--level-1>.menu-collapsed.pb-nav-item.is-active{color:#ff6f00}.sidebar .list-group-item--level-2{padding:11px 14px 4px;background-color:hsla(0,0%,100%,.5);color:#797f90;font-size:15px}.sidebar .list-group-item--level-2:last-child{padding-bottom:11px;border-bottom:1px solid #dddfe3}.sidebar .list-group-item--level-2.is-active{color:#ff6f00}.sidebar .list-group-item--level-2>.pb-nav-item--title{display:block;margin-bottom:-8px;padding-bottom:5px;border-bottom:1px solid #999;color:#333}.pb-footer{padding-top:50px;padding-bottom:30px;background:#fff;font-size:12px;line-height:1.2}.banner--medium .card{background:none;border-color:hsla(0,0%,100%,.8)}.card-media{display:flex;justify-content:center;align-items:center}.card-deck--products .card-media{min-height:96px;margin-top:6px}.card-deck--products .card-title{margin-top:30px}.card-deck--md .card{margin-bottom:10px}@media (min-width:768px){.card-deck--md{display:flex;flex-flow:row wrap;margin-right:-10px;margin-left:-10px}.card-deck--md .card{flex:1 0 0%;margin-right:10px;margin-bottom:0;margin-left:10px}}.card-deck--formats .card{margin-bottom:10px;z-index:2}.card-deck--formats .card-body{display:flex;flex-flow:column-reverse;justify-content:space-around}.card-deck--formats .card-title{font-weight:600;margin-top:24px;margin-bottom:0;font-size:22px;line-height:1.2;color:#1ba9e1;text-decoration:none}.card-deck--formats .card-title:hover{color:#fff;z-index:2}.card-deck--formats .card-title:hover:before{position:absolute;top:0;right:0;bottom:0;left:0;z-index:-1;background-color:#ff6f00;content:""}.card-deck--formats .card-title:hover+.card-media{cursor:pointer;pointer-events:none}.card-deck--formats .card-title:hover+.card-media path{stroke:#fff}.card-deck--formats .card-title:hover+.card-media path[fill="#ff6f00"]{fill:#fff}.card-deck--formats .card-title+.card-media{position:relative;z-index:2}@media (min-width:576px){.card-deck--formats{display:flex;flex-flow:row wrap;justify-content:center;margin-right:-10px;margin-left:-10px}.card-deck--formats .card{flex:1 0 0%;min-width:180px;max-width:200px;margin-right:10px;margin-bottom:20px;margin-left:10px}}.banner--medium .card-deck .card{z-index:2}.banner--medium .card-deck .card-body{display:flex;flex-flow:column;justify-content:space-around}.banner--medium .card-deck .card-title{margin-top:24px;margin-bottom:0}.banner--medium .card-deck .card-title a{color:#fff;font-size:26px;text-decoration:none}.banner--medium .card-deck .card-title a:before{position:absolute;top:0;right:0;bottom:0;left:0;background-color:#ff6f00;opacity:0;z-index:-1;content:""}.banner--medium .card-deck .card-title a:hover:before{opacity:1}.banner{padding-top:4rem;padding-bottom:5.5rem}.banner--medium{background:#7e8c97;color:#fff}.banner--light{background:#fff;padding-bottom:0}.banner--light hr{margin-top:30px;border:0;border-top:1px solid rgba(221,223,227,.49);background:none}.btn-outline-brand{color:#1ba9e1;font-weight:700;padding:18px 32px 15px;border-color:#dddfe3;font-size:18px;text-decoration:none}.btn-outline-brand:hover{color:#fff;background-color:#1ba9e1;border-color:#1ba9e1}.btn-outline-brand.focus,.btn-outline-brand:focus{box-shadow:0 0 0 .2rem rgba(27,169,225,.5)}.btn-outline-brand.disabled,.btn-outline-brand:disabled{color:#1ba9e1;background-color:transparent}.btn-outline-brand:not(:disabled):not(.disabled).active,.btn-outline-brand:not(:disabled):not(.disabled):active,.show>.btn-outline-brand.dropdown-toggle{color:#fff;background-color:#1ba9e1;border-color:#1ba9e1}.btn-outline-brand:not(:disabled):not(.disabled).active:focus,.btn-outline-brand:not(:disabled):not(.disabled):active:focus,.show>.btn-outline-brand.dropdown-toggle:focus{box-shadow:0 0 0 .2rem rgba(27,169,225,.5)}@media (min-width:992px){.btn-outline-brand{padding-right:68px;padding-left:68px}}.pb-lg-img{width:70%;height:70%}.row>.wrapper{display:flex;flex-wrap:wrap;margin-right:-10px;margin-left:-10px}@media (min-width:992px){.pb-docs-container>.row>.col-lg-3.sidebar{flex:0 0 22%;max-width:22%}.pb-docs-container>.row>.col-lg-3.sidebar+.col-lg-9{flex:0 0 78%;max-width:78%}}.pb-docs-container+.pb-footer{margin-top:180px}.pb-content{padding:22px 30px;border:1px solid #dddfe3;background-color:#fff;font-size:19px;line-height:1.5789473684}.pb-content>.pb-content{margin:0;padding:0;border:none}.pb-content h1{margin-bottom:20px;padding-bottom:14px;border-bottom:1px solid #dddfe3;font-size:46.379px}.pb-content h2{margin-top:35px;margin-bottom:16px;font-size:37.107px}.pb-content h3{margin-top:28px;font-size:29.697px}.pb-content h4{margin-top:20px;font-size:23.75px}.pb-content h5{margin-top:16px;font-size:19px;font-style:italic}.pb-content ul{padding-left:20px;list-style:none}.pb-content ul li:not(.ui-tab){position:relative}.pb-content ul li:not(.ui-tab):before{position:absolute;top:10px;left:-20px;height:7px;width:7px;border:1px solid #707070;border-radius:50%;background:#333;content:""}.pb-content table.pbTable,.pb-content table.table{font-size:16px;line-height:1.75}.pb-content table.pbTable th,.pb-content table.table th{padding-top:9px;padding-bottom:9px;font-weight:600}.pb-content table.pbTable td,.pb-content table.pbTable th,.pb-content table.table td,.pb-content table.table th{padding-right:15px;padding-left:15px}.pb-content .pb-code-hl-wrap{width:100%}.pb-content .highlight,.pb-content .pb-code-hl{margin-top:20px;margin-bottom:20px;padding:20px 22px;border:1px solid #dddfe3;background:#f8f9f9;font-size:16px}.pb-content .highlight pre,.pb-content .pb-code-hl pre{margin-top:0;margin-bottom:0;padding:0;border:0;background:none}.pb-docs-container{margin-top:20px}@media (min-width:992px){.pb-docs-container{margin-top:65px}}.pb-alert{margin-top:10px}.center-image{margin:0 auto;display:block}.social-media{display:flex;align-items:center}@media (min-width:992px){.social-media{justify-content:flex-end;margin-top:100px}}.social-media a,.social-media h5{margin-right:22px;margin-bottom:0}.social-media h5{font-size:18px}.social-media a:last-child{margin-right:0}table.pbTable,table.table{background:#fff}.pbTable thead td,.pbTable thead th,.table-bordered thead td,.table-bordered thead th{border-bottom-width:1px}.download-form{margin-bottom:20px}.download-form>.row{flex-flow:column}.download-form .adapters{display:flex;flex-flow:row wrap}.download-form__modal,.modal-backdrop.fade{opacity:0}.pb-content .autocomplete-filter{padding:10px 15px;border:1px solid #b3c1cc;background-color:rgba(236,243,245,.35)}.pb-content .autocomplete-filter:focus{outline:none}.pb-content .c-bidder-list-group h4{color:#797f90;font-size:19px;font-weight:700}.pb-content .c-bidder-list{padding-left:0;-moz-columns:2;column-count:2}.pb-content .c-bidder-list li{padding-bottom:5px}.pb-content .c-bidder-list li:before{content:none!important}.pb-content .c-bidder-list a{text-decoration:none}.algolia-autocomplete .algolia-docsearch-suggestion--category-header{display:none!important}.c-search{position:relative}@media (max-width:990px){.c-search{float:left}}.c-search:after{position:absolute;top:50%;right:10px;height:20px;width:20px;transform:translateY(-50%);background:url(/assets/images/icons/search-icon2.svg);background-size:cover;content:""}.c-search input[type=search]{padding-right:8px;padding-left:8px;border:1px solid rgba(0,0,0,.125);max-width:120px;transition:max-width .2s ease-in-out}.c-search input[type=search]:focus,.c-search input[type=search]:hover{max-width:200px;outline:none}.c-search input[type=search]::-ms-clear,.c-search input[type=search]::-ms-reveal{display:none;width:0;height:0}.c-search input[type=search]::-webkit-search-cancel-button,.c-search input[type=search]::-webkit-search-decoration,.c-search input[type=search]::-webkit-search-results-button,.c-search input[type=search]::-webkit-search-results-decoration{display:none}.pb-homepage .h1,.pb-homepage h1{font-size:12vw;margin-bottom:.75rem}@media (min-width:768px){.pb-homepage .h1,.pb-homepage h1{font-size:40px}}.error404{width:100%;height:100%;text-align:center}.error404 h1{color:red;font-size:60px;font-weight:700} \ No newline at end of file diff --git a/assets/images/intros/ad-server-black-box.png b/assets/images/intros/ad-server-black-box.png new file mode 100644 index 0000000000000000000000000000000000000000..b95865cd6d53a1584bf5e3f2ae665ddb2181ed3a GIT binary patch literal 21194 zcmeI4c{r49^!P`MtwN_tenvQ`+z zlAUB360$|s@1xZ_Z|_|1b$!3T>-Uf6x|lilxzD+u`*WXj=FA_@1Z!(5@1s3N3j%@m zsj4XGfE$kdP>mEw=08QDfaJ57e^b{3p!+o zS#t^bO;j(b_eQG->4^C5O_w{q|NZs4>e|6!fwO+JT+Sc{>U<ly>$;Y=%q&dOF@>v4f>CAv1Sy$Hz;1>BE;3GeHlS#J;UTuL1&dHd=u`T)B`2$ z0$J8uTMdD<`9YREKBKK5--M-DFA9+99ri;MNf98ngQy?{kgX&rtI6P|BFIP(#Au^d z4Fh%Zg9KF#ZB#%{ia;;%414lG)O$gKIzj%YK)bv^majQE-9a~EL5xbXhEg-9a~Ozx z0IAqKsbVgeqMs=>|0OCzLxJPGc-14P8ATC05OHS(Dm`MEpnk&i@8=poprnXHz;5T( z-0^fdc)Vy>A)N*P#|p{~4lApn^^vAb=d&QtAkLexeg>R>%vX}q*Kz#;_tY+1^F2wf ziy=07^k)k|N#osybIzM=6qEld?&=yD9_~C}EoX{&Yj|}XU1{;saLwVXx76z5!u#?M zTz=3Ce#*O+-d8rvt3P6Cx=nM#s&_P8d9`TI#wu$oN42U|u@N8Rkj{ZiVG41fbI?Z| z!E(1x)o{0LAU_P8S=lKwAOd=FQHH`Rg8%Ua>z!ZJco>XuFF!1TK(i&7S8cr1JAG}h z4>q}NOv|n*Cvk&(ZB%bx0)fmGxCG#D^JVL(K_G=BKfWjDnCD*|J@b;1<<;)qS9?}1 zMQ_M)RaeR}$k8HwSzIhnWnGiw4QPDA%4Z2~JIgBkQpYwR(wR=6QvW%fv@`uOf;#aP zZ>b;6u5+)c4p%z>+nXRp9S*e!5fzB;O*osr3hS)2 z%MMtenbM00$=4w0wbg)9Wyl@BJRRw_y#?~ckHwDNPoMCSwu^STW4IUl`=X9(#xxtY)Q>BV z#ffnN6kcqp*So&Cuz7by`-<3lV zZ)u~>N1cpf<^#jiGg349Gxq4u>DR-<)6Mm+<|ye4=?$gRv_)s?XC!D(=rQY|(_f z0vYy?n3GEs+$x;XrtT(|oBJlJW77IP%81J>SHWxWHOJ+&1?9a)l=*wPD0}wek4n{u zT*64Pg6n!_bmT8oot1xth(g2+-iRnBNTswZ-BO|twW~E7;u>UE6`jSm{%#frpBLpq?ucw&4<{6LYViMz>}!pDWrQL1^vCaK0# zg{4mZCNSeiM*1cf@|Cg^vbo=tWS6AvPb=1p)XYqLhpu`uQ~0JZy@=__NGD}aPN8Gr zRRr4V2)d{yr)ny)Eb{7$tGCvqsrChS(PgrluzF*kxiCr?Nc6|y?@h^Gt(lJ=2cwOe z7@9hTh6)eXpQ^S?(2H+XMjt^JW3SHzg#@czs~3oo5r}85?R#A|d>*%O>B69A%R)kY zethNRyHavagN2%4WBH{pqi4_C?}d zd<5Q(&R^Sm>|HYzViXZl<-M23KhWPWKsL-d$mkdW5+mY9=#|F~C@d>PEA+>sAzH9p z{_`SyG8qCFrMksl2)~f66|gaGXg5kQQgu*cfeG;Ch&nlx53Ekk1%62QuxH5Y$X)R3 z3(g+N_{w?zw8QBF2hK=DpH&ai6u2i>^CXgw-fE72Taf+!)VQ{Ig4 zxaO=1pN8k{PZ6ae9$Ym-kIsw~-{49At5kiTdSARm;^DZrTAi89Fb+Yx_VlFMM% zh%7{ZM335BuFpdG=dIT`g%p90M^U}8&;KiHw=q9$ppmdE<5R|Vee=D>g}~x1r+uZd-Q2X{I5>*c1&K-G6EY96d;xZ5}0KU z1>ekJ>^Ty1$fuLH*L{RJ5c9Sow)f7n^vvpFWRp#c&G=|Pf1)W}bVkf*44u=yuI^|1 z1`M7}E__k!0mn4*_LN*NlrK)Hka}KAtc#Pt0P?;=;h; zK5rMEHGF+ZmmAMicBxjW#r)aHb6xU%f$g%U>%E=Ry*?LTx+TpKdX*O`{jWEzM=XTX z%kK`44X+Q_7ch}1E(3#okabxbUrm#5LN=XDJhJ{^y*}s2VX*g7`$PwxaF>uAGaD0G z;dtfI+Q*j@Ou0R^m9@vq-?$4w%;ybOCSSSry0K2D4A5&0Ut#m%-LU=obV08q`c)FnUJT>9gp7z!-B!{dFt(3b2;J^`uL$J9! zIyhk^+@(3b`IP|PZw`Yw*uG7{*-LYr+gy;%NJE=V9^-;y6BQ8Tw-yu>VuL_L1rS1_ zg5qM(Gi*>nC`Uz)&bZFoPfK;eztsP_FmNgw8h)!abZ( zU|kdz5xl^WE%QD11L5DPXS>@-8R@ z4&wsHU>sz=$Jy_1P>Mfjvq4}2f^58oc1}o)8}^hGnAGt1ssHwgQb6EPGC)*9`5}V* zg2Hf!u!OLXgb;*ZP)tHlaEp`gGf8}CV32k;9)I#71_bw3A6sUU`T+6>iNGQLlb5Y? zxA;L?OW0ss91%DfJ4XZ>1$K5qOM!n6ZkhQjwj|^+4j32Uwoo!cQs6%g|IrHgzN-EG z>#7V^S6PltRZ(6P0uvSGhYCQpy4f;si=S_CE1~Ly#UY%mQK||uz<_|A9Z~`bLkd}0 zA%Us@g~0fsqQav5Ffnl(eldtROjJZr5CTO4?*C!_57!D9YuC-(16+SER7i|9;Qsga zph&2Q4O9rlFDwj2@k1aeB)_;Q6v1yJE&>r278Zdaga91h7uw?N9}8)@*a3AE;jm@S z=3bD%VlW#~lr;pXa7ZgLQGUR!6~8zVcqfV!grWq+gki!c;h#(V!OcIGQnAAVvG1`Z zCxFcORwwmPm;OHbQ{iCut=>5!T(GFkY?kKuna;lo zQsBRh{=ThWmOsqw{&}4L4Z(N+Tg?A`4L4hq6S*|~?&{mDe|Lh#*x=j{E~s;8AVU6o z9r^D2@5ZEyNP#y$UmWcI9~=i3aru9D82>G|{+EZbwch>zK8)WHZEcHiLZgr};Ge<# zbKt+7-}h7fdzSso+<#`J)aJ*Y1d!1{bRoWF5>T@KG4^}q@AHi|Gttlx}CHGi};{%r{n1q$YG%PpE8mfsI*OS|_i55JEB%_Pvtf`7HL z|47ka_3Z!h&F?M!UwS3+wY>-l5c1+SF7kXxwA;8yfRGoragpakqTR+t0))J{jf*@V z674oF5+LNoZCvE}kZ8AYkpLktZsQ`)heW%Liv$RHaT^zTJ|x<0TqHoqi`%%!^C8i0 z<01h^5Qlw@_b0N+qg)8kQcXck>^9A-Nr=%guJ+oi##6^?KUnF zAmqhuT;%zXXt!~Z03k1K<08+8M7xcP1PFO?8y9&#B-(9UBtXcE+qlT{A<=H*A^}2P z+{Q(o4~cdg7YPvZ;x;bwd`Pt0xJZDI7q@Yd=R>01#zg{zyts{vJRcJ6HZBq%dmRM&x&ge7fk3W;Akark;EB^1 z5a?|!T1v4UgP=&kJF7Ns6j$6JbJw8vuhIB5*kaOiee1(_(`?5HNXb*s4VW@eh`k%7f;a)14&SwC4$CS zKnXjOu%sjId(RvC_*QxrnMSH%~y=MZD8U2z(6)FmT+nvWiz0jnKdoCTf8 ztVp@atK~+-)s-h%h+3a%^^KPV zpUF{qQ`+5}G4q8Uk#qsCi=NjriO~pWIdtr`@Mqj`)A6rwS-T1@i$s(J75S)SUnp}? zzKpoEyVaNZ9Tq*jE^lsQQO5jbaN_OFa&rlPeb&CR#5AONJC*a>Y{|#2GRwYy-D$`S z-O<981M7j+&L|UL3t!x)R=A&+OPS)r)2v z3&U@?W;FA)LdvIzBh01C_jzJ>n)QF3`gEnj@4EOIw+_D-h2aRd%Q7i1hrHtECL;}| zXqM~UZHNMR>@>05yi=`w7YZtqrZov!x%y$@iUq#F+wXd8u2&2WQZz-w^GF5%sndt z>aC>$1)MC1&@{o-eNQtQ!{snM#3$) zZNsDQ;QFzU^-B>=yE`%8!!rr{&Du|P|G|U#-fNztXNhAYw<9A_P^N-b*ke|KSFX_G zT%0o_JXdcz)Kf`6`!YN{>^kvozf?lXV(w&dadCs++GY9?XYnk9i4$dRbEA#28>>Qk z%UA+|Ky11%>$5JEVky0-9WRDipDLM_S^1Q|v^4OwF%nC}`v(M+FMrI`TF#qmxtTaN zv$(O?Qk;9_OHgo4b@l4fQ23;Ou4$2gghU*e>m9bKy`{xvdEO3#nLfy)DR?W*v?}=C zLT~GZQg?z=kmA1mEj~=zRwJ9hotF0~uguBl*iWyfKH+kKT zrD@Wzo0yu$oH2G;oa&=Fc=F21WYNOHf_i%7!bHbGSi<5_n|v4; z43?2GPa!BMDgr;bL(M)rHalz6uiJ`KoNh^gQ$m@KiKi{pJivIYOwPjc0i2{?!H<3Jn`Dm`>;8cs{zRzrfzm z+L|+e$I7I%zLQf6UvitW9IwBl!A8b8RRScCd1Hfyr8n8n|q+-%B)JBe$cdu#k_DwidXLSV>uzVzYh^ zdX;Pg$pP(jIA7FxYQhZjtNfLwnMt`I!&GjFPqPPj{{B!8=1PS;HDq@3k@`+tzx^Jn zu~m;#tF?=g>%1$+msf~MbHon4Ui1!kmQ}OH>kVqBKWMXL5z7Wnx8637jc&7>zB=5a z=CgRki+*`+PImC7{l3-J)sq@=a07$r`}a4-yjojZl|zs2XJYEQG}N3d&!c(ov2J>f zd0Dr28D~ODiGAIWY5A3}%L^00`CPw#-PF`nvaAERzV=j40{e9xYfk=hBB-{eCIN;G zSi6kVoBZ@fHeqqV$AX$r;j^JBwn~^-s90H|mtAdkDpFQbqB|jTWvKR+h=>S&lGgu$ z)_s|T<5>ooC;B=g3^HBKRSDzrULGC<*t&xwnl2pE`}|UJa`MWTNqc&8YT!0KR=zk! zzJcrOA3Aujb^Me>g67Fc5nxH(puVIym&^q3VP7a|&E|(e~}aeW<4K@!5FtL@>V5 zz|7168aq2XJH|5hwnhpDD^5zXT%I5IEHghD$tvz_3GCkD%1jLqmt|#Tk_n8j8yea! z7Wn)7GmAQm^%UhYShZ*92L}f;F)`V9DY-QOmew{BO?oV$!W9lE5*;A&A)$j9ViWnKr}izIT;ys=3FRwmt~xyo9?|l&SPOQ z5Z1Ij->SubxIRwAUS@r1sJgoP#*G_HLN?C|3Q#sS=WoMxbr0;{4?(_WV821I4Gjqq zif=40FYhVB_$>Ch>FMf@HpE)zci|JIG>M9x zmq|h(gj?1g{gN9KrZdk7@#=|E#TFIb$8Mbj(pOx(v$%BNg{vC14jj&P<4Mot$jAt= z^Pzkey1Ez(?_!{q-C`Cy$<58p!xMPp1~21H>$)%+_FrZD7itOM1bXZE*UAV61w547jLgQX(Pe#f#;l0dKv` zb|6R7;TH?KEqvArTJxb$;ED6D!K%Qr($bdJRvEMfc&ZRDXiPrK8hEDthQB`$_((Kb?KY6jg}8Cu z6oQeiF7(oe>JJ}2sKp2nV9inHK5MSGl(3sw%C8)Lye|)>=HT$@fno?9i}>e8u>m0D zkKR%WtRk%6O-)VB%F6NpK5*{KTHJov(9lp|-@(Ut6HyhwZ}h|xIOyA4Fs)=5OIVoJ zvz|%iFc#xd_n8Pz<$EP#z9D*(7 z-lN*4raisApRSw&Zgr-TnW+5CB%4)oc5x9%cYr2d88{hD`Z2liuX$O-F=;Nk>SCcc*d3kx7%-II^b+;1AMOF#QS(%v=OLfX8n%BhXsph?L zbR?bT_g-LY@AXD%h@||%S z;9a`~sc=_`eB23M3^J_Fszjh`os6bZZ#>w^Pp=e63Ek9MS6$;aJ*YRgOCm~cvc?Yn zJZVlR*-s-?3FwLV>gz{<%{Amht`!$?R*ek*Uk0ab7e-<~DTB`oxfdFn1#i(s}BU z!CR^&cL>$zh-I(t?Q~XSReRARl_duBwrDzMN8$-} zrnx7<+Tf-g5(;6wPI!TWzaFOFCua7F?{Q$wuzP)>O3;PM;xlWh!eQcS#FhazvW_1aUDZRVDV_;{gxLFwMI&Q zQxj&?PaQlT7T3P^^IT+!j<*l3PgRD}O6~3vI?j6NuwhnjL^eG&foiW+T#o6RMv>aw z7)_>{-ILC0M0}ebG*|T5#nLtTqmNIAy;-~S4%NyT%rf<<_teOMVa}bnY$z+wV2QIu z*`udYorYysYv8FA;bXvxV#MwW%|pxkSRPK+SFUIIn|=(Xk3a5UGHXyBa&GUg<88&Q zQ=e9^qjMJbusGPeIybK~`pagCnKaOk)&^i9d!>r7X;)z#8S4D9W&+2KNFRO0wP&JvM^*M=ZwGrk|iev2N-hBS&*CsBuma&vLHbLiIQ_xauAT5 z;ckv6`0$*U_1^V;cin%S1=G-b3J1ISEu`0%Q;fgev(2q6h-Py#jv8 zk!}Gk@5Umcfw#L>Pc&>nASAh~U$_t!(033BS>9Mw^yyP0OFK(jBTFk%Nl{T!D;rA# zV>1{CpPiYst9vnL`Q;Q2<{QV|DJFE>FDgd`mkW23%6kz%BB8`Q zVN>AnM9C8&!Tjpo*3$ZIf$^~yGKCcg1F2k}%=Vld4s_(f&;JPg5wQUT=QMZ^3G`7m z@gp;l|0VjGNc=N6Pan9Cb`jjtNS@fB$1Y(a*`UYbaGptVR7#*!c+iV3J>7ZGQwGor z>X%D{AkU3vuL1Z2bqD(qDa5(B9-gRl*xTX;ZY3?ODnHG?Oh zch#VeJs9`OKu9PcW`zJ>S`fS|=tVm@xf94I9)vBvqsG7es2F3J4nQitjK7A0N6bqL ziNP9CO^uO+rbqI@BWzCSEoj1H#wO=@d{!@Z^sl>LK%mqJ9ALJ)=T1Fn#XUWoVO3~4 z3~P-DmtbAp`HRKg0;|U$&^J4e{tJ4hasp321W)sebjnS5Bkg;s_J_d+W$2G9L8+?~ zYP(if*odXQt{ER+Tv!;BY7xHNx5@*%-F3*Su!7Y-yHR^QO^9oqjVUUE7UDhmcphzU`XUc&~{kd8C z)7yfx9H4h5f^e=847tzsZXZZfW2oDGoI3=8c0O2s8lpkE?P=uwt=I8#OXyr8l@jD> zAQ@>50%=1i7?nHAh1!rnAV{hg-8*5zy-#@b9}$Q?-I@Ay@9YJqj|fFelL&?gvc4yg z%?sMXS0Xfi-S3F$UN8+kCT9PrVB{BNg~r&V@*YjV3jG9%l>CXN&g(9`a68g{DA_~+ zoNkahc^J}zc;6$kPfy^nf+F4x`LJ_=3L;HX^b3aVPn;}$$!Ru+HtC-meaSmF1XFkAyfTev8& z0!3M=YhK@yEX`CNz#0%AuuvplrO!)be?mYW)iI%OT87B;hMx3MyYE8MLh}OK0^tJL zjuvu~?qloBBc(YS#ZD6`{6&mK_C*9(9ILQOMuOsWZkjSCN4Ta)QCgK^iGqLbeRlf< zo^EekN$ISj^yonXqX$NZ#w9CuwV2bz{9!YpE=h>7j8Rh@jCd(=0EV zsgPQ#Ghf$AdQT6(+=-sd6t%$5-ixD!sV+oUCPn>>TEZ~A=T6eH(zw!e4ss5ztN`zRF=M`I7Gc^4h-0Hg&SqS4gSKa~ zjAhP@bN%uOkvr45^11m*&b|bSIzl-L1;Qjs4<7$#4r@z(Vy3pqZ3WTi&5uR1pwZCS zZ$1$<{rnlj;-TW`A;zuG<|*dQTg_WDs1T^gsHA1rWH%EOWoxo&v-xEBWZJsFbfv2>Z9Ci-9yg> z5K;Zd(F%w)i9Kv9Y_NG%d1n%O-fjxHf8L8(WinLn#poSlo3FaxMcZPWq?9-)VfetX z#@2f`AUII^RTpEdAY&q7>vVhlf|T99_498o1N%vd<%vxjxsxTEoSVj*{!=Mm*i&ee zHP~$Xn%hOcDlGO3-AjpPHk~c>kQbHrGOS!CXVPPeP%9dJSDodUe+b=rAb22XlQJ(j z&(Af(I-{ZUh3jK=dv%w5vt_c5@2u!c@=N_om&<-ojwdCY;q5>#VK1#)r$;VsWQ}1$ zypynlvhfY!kklGs9O3X+MXwe=6_FXWe}7#>cDNkZ6VYRg=KIuRWuy-gx&#ew_CTTb z_4ift6AH5mP$%eTiREzYpAxm5g`7ZQATx=EEb=@h3{o6)g87Ul{1aTY?6pFzj0PHC zhSihQCC#LXco^x5IW5c@X3sWu{pXVA?#;VCh+}GhZsnZT)3oQCgPX^QMb8`aSSCP@ z`^^tw47yz05XznVj+9}@&P~KkhG3?C&i;Tg(Pwldayw7xWL+Y^N7QjRQ+#I2qF=1> zq0W0pG-EY%5cqa$-tqj5awHU@!2A{nu#PD zvBR|db>STi2IMM{>=k8Ano&B$GDDb}L1TAdCr?a4@}usJFXf$+uesiCrCe@cHDP^= ztjh9}R%0MmU#c%O;VI*{cAi9@$GP*!PZgn%|9wyuo%yhQ!G>CFu}3|Xi>#@a_NUHQ zpDN)@*YBwyFZ#N#PmOLomse-fn5~4K_$3hv;sgd2V^2Pa#d$eKGv%~M=x^EC7(ex< zBCnvOM!(l!z+iQ0h9OxCEhay9DHhEFb$p@%byl@vWB)*Gk}0;EX7Yn~m1s>yBmet4 zSWZVzH=mGlrt+Thi8ANrz;q>a^vI%rlhC#9fc^XMq*mSGxnM`bqzash?6AQw>{Rl! z{7|SkFn{$Z=G6Rok({~pM%(Ry+vkYnXjP*%L&L-a0?LZvBahZ4(Apk0TqJEdGN5vz zs)W96og=q`I4`Uo-km)pLFJur2yrd^hB)}pf!L6k$wVY!CqX<>DdAL0SF2Y3i(voA z+KkJY#N}o3Or}@4F6;HonxI>5)neFv z8xXq;UgoRg>v^{G-fpLCa`C>}d$oiTULEr_yEXocs6qL*4{tvt6xTd6t=V*`uXHsy zTqR8A>Y3iFcizUm92rjL5ty#ub+J7Be7HZ0JMCdZecsdcVcd~=v#3tKPG|4&hVZ!P zwEwV>*2UD=*3?UrkB+Ik{ZkT$2)^FE7ZLm6=%RPR5uDAi`|KhYBYDtI$!&^j$bm_+SE$Y(BZ_!qP?ej zy79?z%8__0V-{V0!Hx7K&85+C>Aq55&S?~WRMaK>?YP}DJvN3(5QtaYSXtdpT~>xy z&(fR`s&Ajk0B?P01d|%;3xL%)WSM2HL}5n8 zPh4zZN-lEBdM>7VJo;cEL1ca>UO<64%nnNGWNv0*%j+Zn{zES>@cF8l2~7G&7duk{ zu<(^ZQgzvEw#6EimxGb;l#4=)D? zFFP0MpD(Z=GVqDtM&E!}5hDJlL4Xnf8`;@e@iH+vIyy2svN2lP7&5W&@bCaSm{?gE zfF2CC&K7o1Ck6{!@}Eln(gT6n>e(1u*%@0}kY4G9>RQ^{34p;@hW>v2IWu#szYST~ z{)rxdBa;)i~ono zzuEtzVPI8cW&d6Huko6j|EpQPyoQ(emu`A9`u|Hhl=L+!ybLADafkEvoZImr7%>;k?**_;J zu|Lr!W#M6DCZ$m`w$Qh9w58=|x-R(7s{f-C27%ha1OcyPWnf`uU}jflVdrIM<7MMv zVCLdwX8uLV&z{$G$XeYs^9-%<}y|IhT; zxHzCNRy}qGc6L@60}BgGpMjf`70O`1&B4OX&d$LDWdq>&InG~{{g)wm8)G1kLd|~Z zb2S%zz!;R7m6;m~OhccW2g;xiC}n{1Z~?}kP+blK7Iqc`POiU9{EM3ZGWEpR7Vv%N zUt$7?j6d?E63qHPTmNF18UK;*te`fwu&Zbm0RI)ve<#Sl^WT-sA6bDHs&|zs1@*3i z4W`e}^dGJN4C`;nKgEpydpZAi5d75ti}?R+!_f$4aZ{N7RP{%%|5=HxrGcFz)CMMO z2zbcyWKOU`T1hp`P z=?gOb<;;II{O{K9=c@i^l>HUC{~eY5SC>6rAff^9g8mUnKt}wpwtp=D?5}t z?RwMo-cOC4U}owNV;~>fUgZ@wZq7f2u53-!x(?~geA z*$QkXft@VV-&@)L3emsw+5gQC|4ixsrq*k^ejB+4$j#($xNgSh8uvF`*8sVh{0-O5 z_*~=uhU*$2Ht=keaeu>g z4Un73-*DZG&o%CExUKzj_e zj36<7*kUz5&Y0nmDlRcU-PeK_#(?*l=Z>Q(Lx8n=K1NJ?|Neb#?Zk$|{M+yrGo*ev zVz0^ov?M!lGxy9(*;u_!dE%Rqt_tS{eXz=GUYz!Ga`=<9y|BfOh3>6z$Lae^U$Ib=pSM$ z*(IG5v+Rf3@b#gmrS*N6(04+`WO3WzP!MNlMrlU!v#NaC-&S_A5**!M?x*fCAu_J` zji*Mb>J8f~?Yx@4DOMac+2HE>g|;ze@u5){)gfD!yo3g>vC)QwiALTs#r`on9RYj= zroE04eUt)^4b`mdeA>iBkNP(Og^yBx5Y75|Afbx2@=WI?ayt$P5E<4iAe+m z$gWVKC3LoC-H%Xq>5M+DnXABz$X+&*UE=mz#ECu6_g%4Y^W+vT=FM5+&ZeNbpjw(7EKJ1S9scqpTO&$kE`_1QB9eBkl z2YjlA1M<#I?q&tLB~+oRd~^TqnncZ5!u*Id~VH9 z%Xq4GG0e%-P%dXYQ;rzoShr%>YO6*9!|3oik&1`5+V-QNtrrT93{R)%IJ5w z7p^YkJfs!V`|j<*gmY%Q;-bd#X7q?WiS?$AEX3^)v&E*C#gPq#oR2>2`NM(^1wG%R zlOXyJ=r89P@(h>2Ctk2@o%-H)^q4j1FO_oGa-a8CUP@bTmliOV2rhc&cW#q4RuH*uzQAUCT8$9jhg+dM8i-JG`rQ&6tB~?#HBLpUzPH z;PLr`AZ0#@CEhv()>y2F>|Q)@B*Wt7eLk}kh6?xXLU30|>YyF|)KkjDna6$)IO^M0 zs4ucrla~fu!Y8tp&fNOkZ4A3l)Jz`5$13ga&l2P#=zY(u-+TaB7~3!1xJ*{kj}Ml_ zIg!s*O2{6qgiu6Z>U)@0x$kNzY6$XjmZh~C%6|`wV62c+QT>aMqZg0H3I3AWB`=Y4aztC_6L+;co+ z)rSSGKEaYImlnOw-IZH9&vH;? zTbU0_%{eYl>N!ul=IL;3y6 z(-qvU8qs|c4*NTntCH*fhj~35GVYN9Q_eie^ONlEZ6jK!f;F)&s9y5xy_5$}3%Wns z7b_)L49u?yv&^F(L&9tD$yigG(b8_YjL4sljbw z=t&=9#Dy-Rx9FhfZJ8aYZ}NM_RrwwA?D3n|1WZunkRjCfN54w0Bz9CWzWm}!6&rx3 zl&;Iy>qu;)k!nXZ*@#=#-_aU>*-UAtwyO(55|cs>EGHkRmF_@Ey#+MKoLu&I%i z>;Tb^+om7Qo6K7EJQD!&n8<8tX|G4yku2|!Rsi|(L$ztwJ@ORH=6o^do=vs4s*Ua& zBVlhlOfqznd$woQM7t8RpEF^W`l*xI62Zdm`^ihZpEUvxp)pC2o(Q3Q>{L5B%NqK_DjwQ#mgv(38_Jqj5 zC)UHMdU`>%Gw8DNNe_Y+w$Hc5j^q#f8G_P(bkra3T~Ih@?F=TL32a7v2ndkxR+gt1 zQ@|E;Fms#MiYbxfbpqy?lM?vG<=*y&Ld5#aR4zAt(5NV6?Yp-bt>fnD)WK@hMWU0O znd7ETQ9En1O52%NAlcAC6!|9PVkKwvOUddxuK(>7&3Z6e@Q~FU*w>bLEsr8Mh1(4%klG3!#mm2v@XC>)CNZ zhC1u=?9?WZFL!Zaq819OHau0Y?%8KNoQ-+#qd?%q?~Q}J(L+X(J41dVeWlqHHMKqzhgtT;g$pW# z9>yrylqHF8YQu9zZHI=i>WaIPYXE~}a#gCY+s4&70`Q)*>jfyijnS0Q(MT|Qk%5Js zGfcgmUCyx{AM(d*WyL6YnatOrh%7Y>?!j52^vY&qOX-HYo2Ngf5t6MaF)!VVt;ap z)0>JoPP6fte;Lx$-RT8Mf<=Re`_wa?m!0diHJn<7zlj?X@Um>Swa;qk2W*wAw`tROF z)LKoIj(*$ukRSI*YGj0M`^94-Yy!(F#e@hZslIRQnUMp-{0n~NaEx}Ytu+~#I+E#; z@@2Q?I{Td1NC!f!6keg_ll7@CkkA;5zo&s?hbQf9?_?Bq`t%$)+}!}=U+1hV%&*Q~ zS6#2#fFs#W>rf#tvUgh;7&^%_HEb5X>PtplTLCaD}ZVg{w| zFD`cxj<`yMoO9wu4-xVv39|Cw2{{mN-_sczlm3lNli-mL5_*aYk(H}$baT3#$%kS za-yqlcBy7GUnx|%yRa&p<5?hYV)5C27}=ZZ53#C|tUXAI#oy&Ku+;TsqZc+R<`Sjv z=48P`?0ecJS!}l`CNA61A(!wzgT95z#EYvL+?^fFN}1u(j(SJPY)jLI6QLfHz{Hh8 zh5I%Kqbcs@qn<`J1xPu_*1Q02O)inUJ@<1>~$8cNN6~G4YKib@o`G5*muW zY4jSlI31f@tiwX4< zYsH_OGRO$CU}Eme5#SW_zSVP79~XrTY4mKGby6w8qa&)TVtV+?dp-y{w;RXp8 z`*5F-6JM=gO8wIJdu`v>T`0psuu*Y}DbqKtMKe&LaTT2mmukr{2251>I3DnJaTN>8 zH^dMO4T2rwdD(AU%6eS0wbWL=&K3`$(hx zRYPwD4+{mY{;N$%eM4e_10qpNT=@*zk0Gjo0`YYBeM4idK z0F*zX=k9m!5@-HR@cmLB7bajok&exfcZd?{}7>LZ(|Yjyy^!Dff3brZ;l z<^>VA%2|)v>F&L*&}^X8anSi?Jz<*xbEEs*Hn{7{_YV|wYhOy|4>by>Uuhm!40W#> zYas`>;^2g%zwmNo_Z{1d!OVQ zJ%3hf#5^1kFg&rbvVAI}U>J~F!^t9+v^we-SmN`d{Rx9=kx451P=I%Fi>9^Q!gyz7 z%Cby*?N;`;6)|8fNlxW)gw79Kl2|k!zKr*D3nAD>!PF?4){GfCI$^`S!>m%n`b|-% zn#x)!nAhd3!GNdzp@hme-vQgkIQFC1_7Gq=5EAEeA+cdbSsBgxTRZZGCPD{A(_tiy zC9qdWp?;cQ!(2kg=WL#F;1(&ev67p73W->eONH6Jc?1($ik&*`oWRO?A+tXE-g{t> zv)YMCB7D|xf4$?A6$WNJL#zX|(!q55J<|j>C^irwN>^swCH-VZZR8?O=M~AF)HDR* zy%w!?y6JR5!TN0uh7pU4q$#0QBe1X7y!SLwL8WU~WF_xWbuq^dCD`4~B}>a~uE?Gl z69^u=r*5Mc3U`wd%RCgekLqh)GSU+)cZDZZ@0xOe8UPjuLtAZvaJ^furd3^&v zx{s&9^kp1Uh3A0~m)+JQ(?`>DDnywy$h69YcRw>pjG2@gsMB|o6lLa^Q>Hhi6MFZ9 zqgG{>E6gRr&dWG__qGl(F_Rtggq{l@rm>T$FT2_MdGwF6unk4a@f`IVGHRdoNkq)F7{mLSaAbzdGtu!@T`F(C)6NUP zGD6;PwlErReV7!Iw#~mHXE8Z_7qJ}0>Z!C<+@mRng75o%i?o$gR2!?+qkyptQ=^XB zExjl{E*tY??5w3G-%ls3Z{ZnQ=L;k1EyQA0Y|w%A>A|blpFTvwTzR*;rOc;G0tYE#MRQ-X^GPXCk{9wca$kCz4_ zRu+ZfhIc*E*)J#Z7s_3k8<;&d5t;+>=K9$j5E;*P2f>9I*p+3^a%0&Q(NR#Tv?oxZ zC4HjYH&L8nnUjO|$wtIuEIx?I2=@xhO$)b0qsXyG?JDMQFUv5vObWIzFPGKd9YDZ-D>U9tT&hD6SIWOy=#9EM3gv7 z0micPTkS=TpU2bw5tCF_bW~)0FsmU-lo1LJ9XVU;2AJ(jij$qxGU)D|Rs>l4z$w&> zPpACk4p6*iSvT;5>R!6~SFZ#B^%@Z(MB#_-pmB^9PXZfPoBT<(OCP@pbi?3Bifpca z)o3&2r`?uQ9j%$ntxkD6D5g?-MAL;+XNb_R`lB-{O`eiLqZ@*?9rj^7QA8cZ}|@^-F9=6&3Xp-aqDy)e!Uum^$D+jqZF|#^~-z z!Bi05AC{ak^y~-j*+&=s~_*2VsABoD03u&%R;gL5B3<8p6u>ntFOzf4cm!uFe zBg|;2JES2%MIp%vS({Ku-Oigfkfk+;U~UlJ9lP0PzgX4H?l4Ae%bZ=U7L{5C5wTGT z_vz`6SNT{QKlqMXNH}!PdwqorKZK8X^yjblx%fdt9M7Y_u@`%|(bGBP z`n(Q>Pnu&cS4d(+J8&{dtsYhVh?i5Gx}+L3DGWhr#>n~957+KD!6R~c_nAp{_9+rL za^t~}Mek=v%#!%5)u^H|CX9&X1-WtPH>}zYwBY3-#)jQg-gV}5mZd|jDgP1Idmdk1 zLv)=&l|3|z8FBr4n5RzOR_|pV)ar~~?vA#i8QN^+I$!R+J=O+p3n@Pbt0gH-Ie-U3 zUqa~k76p$u!mxqMyd{bL_skC$Bpizh^ozx}O?|wgDo1;iD9~9@^3cPcXgg|$IV{LH zYNJWcJQ`J)a_H?yYD&$Ud#!~nX8mx|VD=1`e5J-`bM75JI6_&2H0d%Pd$EkVhVf;W zBYxp3k7kw1aG^)Ceuuk$6t_*b#TPfALe_^7(6>2wK~h9;*n*fBpHWhq0G5`p;j{#f zT^~h^11LKRxQialvH_LQIp(MZ${3X#GZX*k+G=|1MioF2q&Tm(f&epv4U?LtDws_$ zXfBa@r#@8shp!o9xyK271{*DI<76yPGD{0>RsO`??8l#v+s{BfsNbaU%g8W5jMFA7 z(uzYGhTzDv$Ol3-Lyci=w2A98rWxGyu`^F%Co_Ar!j-nU*9)!Uqk(&nk6&APe2}po zCPf48PePmRzjnReSbrf~_5vet3W?81;Qb49&8F}JiqCp5JU^)V(p>Df+n#1fJ~Zej z{mB(g{E)s;tGbUnx0-DrSJz6-&iCZI)>!OYA^l|`b6EBc+NKzLRG~fXI|LLEU>AWe zvqdP*_XQ_x%_h7&J8erD!9GJAnMG5M9QlOCT)9r%@C6U5uqe<|rsXRb9rW$a;h*p4toY6vqEqOF-!a8QFf_p2i(~lfw}KC}XC%{a-hD zuL=)7a8q2^fkfJkEa_`(FV-lCutBKy+%sBE<~~CU7nkQ~{iPzBaA+S{)c7#<4N?DxgI%62oR1sufNsb0H!^7&Q@^1XX0uA4luUA{CN z+#dW2`~6Xq7lP}L+K~uuF*x=yR8O%&o8S|>9Ts(ZQ-o5Yq6S}Qex$@tssrKs;(bA_ zd}w29Tclc$PNP+27BA@T!t9VXtES)1U@<~5Iz0F)%Jg;7lTIe;$k5)$R52<8* z6eC4iu}Mh`k^_FIgl+^AWw0(a9rvt$BLq|eAB;*FadL}Q;T8-swx(1R_MmBt*#`I1 zOvxxJ*#x_q_kfjG2fp19H3|`xj}r|rPkVWF=%gvQATEE zUu7}fxqDVQs$D=6q+Qb6(Gf57@}ky$ot2I4<>l$@eFbsx)_Y8KeVXH;GUeeirrILb zKlA8)7Pr+Urk)4mZnqTu^^VdYMo8?@sDzvp6cld9i?P5_St)0KeH6f>F*7sMus6B# zoQ?xW!9*7U9!^*^bzE6ld0}Y@jgZsq^5PuwCN3^6G0}BrL9$-kk~4AGzD}FzmOT#K zeqiE7ixtup&d~YRP?!3PhnGkGq)7SJ*>Xv>9_J^*-U#)FGp_z<#6f|9&ilh^n7OUT z!;iSYNPQSaWLni0_1mq4Du|evy}S3RWX7t@CxdVv9c)gYuIpTC77Wk0tQQ?0A0NF% z?887pwro7-Y_q_SejYMVM}x--6<0F6+f^nw zA16b#FZO~sb5;!k>8`gzxN<&n(tYi<1kCp*2!JC~!NGx0y#g>^lT{z(tD0o=z8NN) z9;@ziAj$zsc}?O?i8V;KkVu@eQJy6QNr=B7Kq4i)1r>KsDD3GgG=QwBl)R}-GwdYz z#<4{5_IA79YO1JcB=zpV`IjH*?IR;T-Nf|)=Ub9Yh4dFdDqwXU4ZI- zR#}O{mC5;!nf`Z8bXhhsk0f$pjft9L%F|d`B3)5`+ zK3@KuaWsxaZ>c*`?b$Ok&cuR(f)w`y4Y12nydkz&M_1Pet8Yz8@&b2I;rcGVaa$aG zAFrvYVXEJYl$X@d&|qpjvvGDlP8SOX3P5XSJA?8<#DZ>4-^WUwot zRa7GGA9*>+nhkEpvRu=9XS=3nUmt-aXX&w~n@3gf6t)pEmLkDU(c(L#;;C!Q~Y2t0p;v@Zcs?{RkY<%^60wqeiPJZ)A!n*}7y zBp%zP&Z5rFPJ`}*N?=y7u9#3_K8G)HK%F%yNx)^#2pmb#vEfi)N&>W+RATk74Hs-U zoEB=7)8ht{A^}dOR;^iK6wx*h)fk!IcH$?oFQ|7t^m{~l^#Bkpg7>$BNlPX=x|7wM zlxK{it)YZCV)0y-+V=JwnD$#UNdZI9A=vS)-U1;^kG&NIdm2M#ynvO(SRLG}$BmMg zRURJem5+}UYS?yjjM6`Q-)B-;{QN^zVPQyscof+o&8JqMWQU@9F_EYsv)#Vp+G{db-uv2sjY0*0gP}0N^zPK-_3OdvuYwQ4v zw8Jk1>wMFAzF`RszgtEI66rkJo~M*N0i4QRTD4I96SEAEu=%#?qN1bs0We}?Vz468 zX&UT-l&7VlvOi_pTff`Gx4OD2FLb`wlf(x^xRRpc4iN7z0nZ8-JjqR9>?ot}Dzj`3 zCFIJ-@1ss}6M@WnoNfS-4UFpe7+84#UmzJrQAj?Yed$Q%cXz(QyX8H#;FE5m&_Mwa zqlb-3t;{kX5lH!a%L*+?B*bzCd6MMB6i^VnwM$BJb1~q7XR{_I0r0}FVH)lmljLpIjIryA2cOFF^77kTY9&r5ef+)8s(Jl9;G_Ey0;sOe#_6~GiHc)8VN&k~b^p@#J5* z@PBzj0o8%31pG2$==W_SE+m{7P6jTv`7GEfi`A$sgT(&x^F>Nxfq z!xvF4bWvor=G1~9?5QVO5gFL!I4v)E4NNrOm!V?f!D7rj2W;gCMjml6h`037w~X~Z z2>TLnLTTU&V$a+GiZg9Ha;Beoh*tYv6mdW3;(PD~FYqbIXa(z@1u?XUriDTQ34o*! z#}}Zzo_ZR5q6r$O;S<`m9%M-WHz#Uhcvg0a#iT3-!*=j>lnAC;3+Z<)xz5Ahxlwy zL=PzFyx%bR3@g{jcg?02bn1GS*6s;n$9^o>!}E2g9Vm26X)l^t-?=p>ANxj*z8Q(1 zt-`Rgy}{Uf+dSyXgDcp6+)4Vc8-S!TXP2P6stAIm-z3q1%RWd_Ob${k^5WJ10~Z*~n;7;PIK_sC zAP)QmXDhDm006+s{Cq=%GXM?%0C-t5At53%50Kj!F zP0>V2aTk;4a_L-9>b-BAl#K!gERlj>m@j%XIrVEeRLS?Rvt}{m+h2%?K;eGNd=D8J z=^KtAPlFf=KLfMzIy=(;)BDiA+f|QG7E@m?w+0_-rg^tZ&eE!eVcK936U3S1S$q)- z1qoiP`1gG6UfrPM_k$<31)#!K8NPP7CxHN5d2@5WA#Q_d0YJEpBftXMK&fr?c)^b- zdxFVY5WWErZI03GQn0@00DkvK!8`!JD1>iX61gHE6AJLQ-#~vIAV&*$OX0IM4)9I8 zO7?&NXvV$9fXIvn5TO~p7Y3Me0ZN8dLPY>-^Z;~YsjnP>8Cn3ngsQPPprQ`YHiU{$ z34lce(96FMqyj*B0N#EhA#nu+Bm>YzPgS|UzbQlArUsKruH) zfBj)|xY(8-09bYO9(|wzR^j+^LHk-gWRo31nd%^9I$eetSEBIO05W&yRL^XGvJuJp z&@el@xv?=L`BhL;uTRzM!K6dCP4(XL+ME0C@?xcBjnt1(+fNMYYNcb~TsjwTI0i02 ze_<<1?5+;s@eY5S_^X6|gBmsZy8KJKNa2+5Gsaxv5WyI#F0!#l!?k6aTS(qz7C?nL zFN8-lZGpA{56#}^D?XPIspz+$DFSH}vy=4s$B>mbUh$;wg=!<9nma62PAZ5^C z1wQp#-~>NDbDO+rP^>L7U59c#GLJ3FjUH@zJLMNYI4FT{uxNU(=iWo;hpLf8!eS){ zUcGJ?hk6-CO4R!vU7lDfnnj#JAykP-SseeA$Nm{du$E|JG}ku(KMAQUci&a$zw1*#+vQpGX@VE0l{Mksg77xSF(@%#3&e5gsY? zi#a$pILH9`4hrJf0;y{9#uwLLU+FV41gnYDkW9UdLIa|Dychb)M*1>Dh>@bVL0Mwh~9h)+(_H#++fCssjpyOnP9uTDo>Km z!yXUA?opy=W7tpHPDV+#QC6d_rS`;#?t_n)j3V;d;F#_o}$7m4k0EC#bW!-tYwG!X?e{eP3pIP$O1i* z6j~HwCQ(Dr)3z076&Lg2^D#j@oEK$uMHacZSxv$&t=9QRN$D**zUk67`Acri+c$V# zzApC&~k zL{Y-cy0z9x*R8s(x<8RalfNdH0_}m0QWQW9c~p5^(p=I#g9C%vgHy>YsXPqRjN7T( zsne;;b#FCXHE3!JYU_<8DmOIp)Q@VvSO;owsOPFFYiL)AmZp`GO*NG^<-f>pkcpKk zPMJzrL9RqLf^qK{=#*HzYe6x$r@)#w#*&jW)LJd0e6uYvFF zP;HOSslvIGGW79?&#UV^VHaqkHjFwv!?a$D)=%}-EKM)VqGV zL|(d7-0sD1%^Q-A7k1jK?qe5esa2^RhXwQHN32I?N5Kmj1I!sz>FP`lBc0!bR^&HF z`4BSV=`EH^yk&)C{Y+}MNq`2xXw}l`in?5vqD#GFEZ!fy_8IHE>)dQhj7#de18i+| z-|G5hJ8jZ+1DAz-NFEIz-5*B*`MzWjCXgY10)Cp$Zm--uU$;i`an2k4sGL0%2+wQ~ zzz~RfSNd+Vz4W!|w}TI*uP?WghN6eekOSqsccw;Q^tSZEI=vAo0)qopgZLtC->cz_ zG92C%P2det!Kd^l~&Uie0+3|8UrZzW7N|hF0ZL7J& zoTHN4&TSrk9pm|%AQk8m?)uPLYO6`v;zQNMGVf+`caVjjPJ7?G_8JI_eFSCr%|NgH zh3P|WSv8>ga*f_iP#P{TMo4HG`aD)5hR+P;g6k%3uuWfU@iZDaQm zZuyb`iF3|5+@oX_W}MI&-vl3ME|_wfBATk0a;vGY*(f`}J36(u{^d)gP~<}6r1BlRL9jZk;kxYt}k3eTBr4n zrR^*7DBP#l$hk^Q23&VMK{E3_Cq$*1|SFmt@%W8UVH zc{aKrb_pHmKl~7V5rrc3JSsV=KL{ykKb@VIgJX@){(ko^Uuf8Hm^>ZpA^V}f3=0$J zeKom1Jv5p$nw5B(7~5*)nR~z2wvSyt-`&wo(9-M5#GrGoa(meBvfzS${An3QcEgj% zhw{<%`tyb2Nd9dsc5Lh;6lBubodFZ=JOIG%YNn*-s0NbeG_bLv(=)WuH==X30;WIOx)exNYPzJ$-v#hfWwfO zj~AZXl@sj1%E(cV$kocy+JV!RhxiY_oM8E9GLV?)4;4oX9%6x?1rn)&F8+<=;@h=7#LXT^q5%b+1VIrh#2V^8G!WcKzc@6dJaw&7EWe1qJO-IdEvnlx4oe; zr-HEPKMDl@;vqJ5bhPCJ0$p5O=vd3>+LBU>`t6Mq022t%IAjqn<0RwFAkY zPX6gf*vP@a-ptm~%*LANr(ZpN8z)B|V&b0#{q_1s%dBkwD#+U5AN0T+fv$SCKn6N` z;D0kRH2BNL*2&)TkE$6O0F5k-tcSjxzq0?wg2BB40{wU6 zf7aK^>c1B4;3(n@M(_`$|5EHfEgh8HY>j{lMh-Sk_69~G&funy{I}LSni>DyIsfA6 zXU_jvcOzG`|H15M&Yxy~423^?h#TBiP9b|EJx3dRB^w({-ap6L-)B%F|Da98z(Ge( zM5$_KZD`}-K*bIGcf-GX{coQ}!g`KIyx>vENXtM^%fP6_z{1JI%E`<^OV7qhPyfWp zpPK*X17u@pX6*Lgd~k3wvp@CmMDyQ$faj5+o}=FXk(Z~sPy84fa2ng#Tj@FSnpx?Y z7y)gqO}K%7CqB{qYiw}}*;v}xgR5o4%ft=*Z^{4F3VgmQ_vh&RB5YNeJ_T6X?v$3^_Si^bFY<4C!eZ4VW2dIXIXZ zY4r@4=xJHl84X!kjr7@>joJU`3=rt4`G2?;wlQ$}IrskI+VKC<^%L{|a4l9D3)gb+8uwU{%bG& zbKL%CuX6tkl$_uZ0j{0iA3Xt{L;sQXcgcV1tNrX*OQ%2dS(xd;FCfFu&wrRc&Hi^& z_5a=UY4*RH{%xsjZRW_!_>a>5E%}Mn&uIQHjeL_niM~ss6VmBL^7A-z9b0D*VRvl*TXR-?)B>=&8bQTu*8IQvQwW zmx!J!{KoZ^#xLdHxPFP~slsnuPig#8{*CLGh@L9^#`ToOFXi93eu?O*!f#wpY5Y?D zjq8_)o+|vt^_0dh<=?n|iRh`qZ(L7l{8Ijn>z9b0D*VRvl*TXR-?)B>=&8bQTu*8I zQvQwWmx!J!{KoZ^#xLdHxPFP~slsnuPig#8{*CLGh@L9^#`ToOFXi93eu?O*!f#wp zY5Y?Djq8_)o+|vt^_0dh<=?n|iRh`qZ(L7l{8Ijn>z9b0D*VRvl*TXR-?)B>=&8bQ zTu*8IQvQwWmx!J!{KoZ^#xLdn6&L*9j}sbMgP$RE0Y5D0ukN)5e$bG}KwJR?0JxI@ z0KWbJ!1W{edj|k;q6Yx>-U0xei2wkWO=4m41OVXECLt`KU~kzqP$^dA~4xkBTnhhe@kZUGf^*3*K}zTLdx?{F7Pk zFR|J*b0k|N3>qG+^i&+>&k_m4L_!CrUPyf2Q5@MPm56;-Z(Dkzpb{0;1>(VAPtR9vzublZ?l z4qJ?LEp4jFe7$-VACiXAx)Ey_5mJ#xARfQC?|i}Q7Ed}RYdb_Qce7FcT`bh=wZyYN zP6HjihPJ76+LL-TZ2Sa)VrJ8LLEfs8YWlWmC(E32-{I_4!7yk^!i{efd}&R|%H|d( z!_}Y3g*Af1nthcOv?^?kt7GvK$q{IAD4WwsG9Eo2L`6epU+tQ|UjR9szO0%(oq_DM zw3=a7Hw71KBq>RI(@Hp`LUoQlU5a}UT^k!HG%-0b!Chs$u_q=rniztK6qjCB?#=5% zN>#3q)fz?K%k!Cdg`wXl@N-nS+U1PtP0VPv-_ zYc+<;6h-ulu5zpz@>k-oD2v#ea_n%+iDX#?DzIO@*s|(>=URcXs4D}RYs1N2yfo8^ zHD?#t3`rItGSyqu7j_he2JVj-^b3i#E)5c8i_8h~0#Mx8r1s{Ko^__ZgUy1D8hI7X zH%WD8MM!auw&!UFrilxRWwZ2f^TpGE5;gkM1~M?K%yU7nAL9*H zt-6>ECvdl&(qXeA#&US%|5~kR@IOE)`R4TIrhed&gxHF!>AjDM@z8 zP&B3$CJbwPw3cSW+YODmw^@E;u@_yDXPTE}7ucN})_HxQ!D8HX1Muy0z?VSFMX%nK zT^)AzMqIfu>2|YTR@E||=C>PF%qrlT^V525PQR<<#LfTE;)7z=PcF=PZ!#G$G-GFT z@5n0#!dyg&V^)zfuUy%ysTW~zR3Jo(BiPvbYQ12!ztUB8c|Z|dq8vwQ5z2LfCpnfw zNTKshDLPqC{t}BUB8_NxuM#Hs#?tehOmmi>ed`5iEzrhAcdyf0X8&lI2|={Xx~l(V za0p@fs8Q(!w(?8t#c|{wrp**7NyaqF1s#TE&oj^sjhdA15qs;lA?EZ_YwIW!Al0OQ zbv8{(lHt|2Xd%y|*@s7Gtt+ZRdXI_vqP7(RS9VDkl$s{7qYMfQq=_U}JY?EA!OxYv z^WN6Sy)9Q{x``pu09oQQ3wZfF*3GZ4( z&f}Z&cTy^+vU;=nH<>|uT`q_mjtzI~Rwk*Xtsgbeo9tYUv*7^hhK`{lEand;-?@Mz zSanXLEJj?#vb7nD9*o6&jwp3f=)+dWz0&XeurexUs8U^YuB@kXKVnz8i`&R}Bxl=S zzF&6og_;`C)0h+7CH87rUsyt825BTjD1KW)Q_nbNhaqZV8~;iZpXxCbuD*QO=*Us? zzNOv;4PR)tzU5)Fqih}9^7ieGQZ=zZvBd#uRI6<6rFqJPlo~k#w`1ELBrbbJ*B>HB$LOLk{3`cjzIhRO5gZlTdnxPw z*}kIEegE>KY#<#H`o8ICf5@|FRlWfoi*od$N_dL-7U5X;Ji`L%$J#+pQ(+}7ib{QJebm5Y>~+Fq zl{3P>`+;}HzI)0KIc-7H+)bh;DvE}>ahR}hY>-C^WSz%k3a(Pyti*y(?qeMLZus6t zS72w?{l;5|j!!M~P9ZHj%yM&w2e86A=Wg|vQcbnhp0lspqVgeevgy6!JNQ&zq_7pH zrmy>Yx31!2IaZ!SWM&GX#B7hY3u>AcMWrl-lQ|mrN(mTB$yU}U;K%0If6USeBs||H zde_Cfiksf<1X-ak2K5yLIeiBee#WAg@e7 zZt9`bVr7h8jjJ$Eg<$XZutILS=Gxu3U0^g6G6=IH7Jz7d5{G?5-YwyDAz+B^bzEdm z`4LOR>a?VIta=uGF6xuh<~h4r2E0qD{3J42_nBtls{d}g{X7{FH?=@}9l(7yGBOzz zmG3vU9v81Fddp=MH#vD;0$dTl-q3qzjh7siq& zmcl8PCD>hS`Tz@)7t#?8zmBHLtQ;g`m+L5gUWhxLp*?n*pQwn?dh;W*rFue5nT6?) zUz2DIb5NQO_U%o4GZ-a@x_`EJE6%PNllj2PQ62bDT3rHk{+QqS`S3k{!G;P|e}Y`* zGW&$FzUL543@ z=way~X`azQGb|-vIF$|g3DI0^S>k-VC013n!8}BtheCLTJ67#)mE3>NZi7gg(Uf(V zGac)-!;e64K5Wvu_y$fMYqJ;6=H&B@I&C zZAs~EjOkepJ_I@iRPj6_rpOt1slr{4*~eIgQcJlH;?~208faXIebI zu=C`LiN_}9x>D0G+Mp<=piH)~8WJuZScT(w&Kz?Ygd~iMzHNGcWQbI8C3bBAbx0}(q0$?&sIMc&>I(g8?s@oi-h8bV8q}2W?fo=Z`RDpnXZ z0iFc9p4Y+T6x*|Lt&K=zgUqyM)73fJ!C{!f_ueel^3n@yuW%?AOQom+MJ3yEWQB3> z@!P&tY6y-eJnJlOUpVZv1bD_S=R|e$D-7X11EAS%*PMhw3D{zfEcy}25APH21&P~vR5_og}ACyX>>WXjjRJM_-V`JAV_1S(RZ@F^QfOys*f z;0Bjlq&N)^A{~rn)uf~`PHohi%lpWAYM5&lgHS9j^`J9HDoffLnX=a5$rHfU9nB&A zb)eir5IHyc*~t*ml2hPrO16Z{P`6y!2a$R^I9Xl;)sV7wd->SsP8%tJNF}MQqFy_h z63d$1+jm3c`L^+Wt%~->MtI4|wXNG)dC9vl(cUL-j}8iA8|)B7ztUoZAahgWlHYuS zq&x(KmZ@wKEcHet&GIXt`yL~l$7-p;J$J8S5Ku^vUG5t}MuS@-_*y&`ONJ9;d9!=; zvNHv66hw6Nz}TrA*n1bPj`(f{_3Lxn#<44zyrBrGBt8~7HR{4!JIcqic29tl=-y`a zPzp8VPzG|do%O>c4^KP28N?g2TmL?$R;Y05$;SBc(iSiGtv1YOlt3^0IFf9NS60P+ z#Z?YsU5@tXC=e&FMiy#0t`JQnl59Z85NOY9iD&tdn>H@6FNZ_rX!I|W7hUJO7p*FS z#>FK?#!G69GgPoC9fw9=B=izTKJu*IjH>U#cyuXiy4+Ry=T;F6mp_>GyT7qcAi$f^ zGEszA*J>>DB9sqFaOctX$eNqTZ6%J2hbG{p|9m;J;jFajdl@Jsf5sP9x8y52Cumlt z$-#)_;|?oJC|~2}&Zan>%eQKGShODzXEN-$$mCCcso&S0*>?bhkc(69sQ!6oxL3ar zTYjOFl7yiYeSeT#-U=0j^aGn@RT{46l4y3IlAqqlFFUNm^^>6p#zHTmR7&+ zP9IVY22V(I%0dOqVC2kd*_`H271G9~rC#Vm#U5=kx4w&Vx9Q#v$Q(D@CFerTY2+8u z$?@JhRVY5We)=G6P>zc1*mjmSaY>@vN;{bj{F;tx(o+9eVYqf>T^P^ovdAe{Yg)9= zFC-#mO_oOK!oEh$2lM+6k_``oR&__m5(XcpAo`TBrjAL#bDtsLv73J> z$6=3F{!Ttp8q?2_tbtm@p=|Cv1NDf@-<8b*q~|=4sK_GK%)w1=nG}$LL?R3FPWg1} z0y~}7Q=iK`*iyjy;mR#(P>q7zpQx{T15K3$p?M~vKaZwG>#|2Ybu>~Mz?Bn3QD#0T z+*};9vX8a3c=bt^_u0OTXG`+1!Q8A<$qs~77ISp3;r*A@;2yV@?-Ok<`Y;S7UX|B) z_e7)06W-&1JU9W~ZwmVwI3Dx|kQy07a7KbE8LJs$@iUptrQ z7(i&?P=X97b1wWCjgk-mFq)CPnzpV2k*X(O*>)uMR=krLlMG$>Y077BsG$N9kb<9t_L7jUepCVfzaL zZqc0PO{_$5W?-(_;|FYrg%TDJPq|KfN#R8FMZdB;qg)%ix)D5I)|{q(eKvh=u{e;o zQ;Rh)yI|Pi!b2*;SeLdf=zIRa$+D)Eq$;-U>cqggkk>60Y|%IG9|v3IEyv&V#^_|x zHZc;Ku5Q)s{QW%xb%ySQB#f9u>p|FCF^fxt2i}BLeUn#dYk9A9n zCJ|f*GIX&rBnuJ0V^*pm(xtAhel7m6&wB5=uaXtoqxYqP-t+*K0y!*NwP>lH1;1^D zzv=LiV5)wW4JaIHIV;E;)^AMXaoI9g{i-=2~i~L??4SJAD zq@l+d9Du6MVk&ho_$KsaqIq}(y>QAthSF}~&89g|7xBs<33BAifO+*6l_IN_SWN^Z zl=>>w8;6A3O1^Jn&ECK~SFI)-hy8;RUMx;CKdMdj;Ht_swBb6o`G{J%Mis@NhG$p1 zw(P2nu?ihv@X(X?=P2B_L{WWvR@m zLyv*oQnc#c1QiN=7G7FZapYD!p$HI!O33)JiUvS0{c$S?N~BuB_K~T_cL0Too=55H zN_48>JIta3CZWyOI4%mtix4rcHDITI=#;BY<5EchA0}k27k3jczaGnE)5Z~ylKUsU z+VrgAS6BJO;_=~!X}zFo{4GxD7T3`aon0mn02YOyl%)X z=)Sda6AmQSOCAUvhXyaK^pP4keM!cnNdvcGY#k;ILpzvM zj8Q0-TC7HywEjIrkt(k+L_+}@$EBxDj^5@|ArB6h(8`9xLmZ#imaR1(>jG-!+yjD8 z&}R{5A&yv&xp}_fNhEU))M%A0+tq(tUfddY65`cnOX?yWS}K75fhh_#gN%f!U9WC+ z)L5ppgCq*iAE7X;&j6@@&)z_0jwS&?B+PuMV5?)eVpm=*Rpr1)rj=ICoXcPcTNOWP>tPwX~25g2O(lJmXPJkCU;I(?qi(wf1 zA5kw6u^8Bv#tJnCu~Cf-2b#Z|v^M&gNk%@%Ck=nI)(V4^Hq z6FArtk;k$-=dM|c3Y5<6yzT$2#Y!%)^qsf4syaf@2(WV4Aq$jC84PXA3t_!juGf?z zk(h;>-J-O-FJEqW)GDK$SDU7$X?ScB zMkrgBHSS{s=V%3`N zU6;tFH8^o>KA;56I|DuhqL6&L~c;EpM#lgA2(9C~5b;upxqFGrSgl_bOZN#z!*z2Q?5K=P@XQwvQN!>@UoTazj3BI5YcQ9jOu(V|PF zFh5L(0f?xeQB{Qih)kfP!W-i?=pD7GuRRnH?{6;j_ifD-6V2w)w`}_Lm?CwHOLQHm z8|*LqAx7J?{aR`bpt&H#dsRNl6hhfj=bDd_mdEzS8%G6Y%h~u&xER`SsqO4rGg;)| z0?Zon>ILWZtGeGP+M~}SW6~tAHLs4o{S?A&SGv|CBvM9ojIkLt~qTADbQ zaW6j@M}p6q^pReu3Nh#TPhuR4L%eq(TF2~RJ`2HYiBrpRst65y=G&>i69Lkxry&=R z&!p_@P5(5Stb`K=dAdLXxfS`{_2?|_Tu`}LOen^<+fM+sd%j#%lQ(RTxF|lTiN)f} zn0*8s`@DmBT+mGf^AZDVEPZrbvY1OPbGc*Xy3*txoNqf(IC-c*=IjF`y=gq7fpYf& z%*_%SM#FtDFMUpZXP+}1=f%m{e5>{}7fsyNGM%JC?g#X`{#U!T!bdqfeM$E;c~^B-x2-5fT%(Hp2(>^{tkcFJ5O*UpQJo z!t@tVxZ3|%QX)ECe9SFbZlr{+3Ug6-v$Vuk#^XxIP+$4@?76Q{ge9=^vAs~py&&-A z<9yeZE-;iuSP;%I2;r^z>Tqy9w#rP6uKP+qsU>zkC-RK6i&sDVkfm zpl`$``wl#opwuIcJ7-Us2ooE7p1}G2!;D+wlK3uDumO-Zlt%n0lorj>d8WMe^zP1H z$D4zS`TS-exp7VZF#`9HLfUj8=(Q>DCxr2#vcR61Zs?LS7UXdFu1yQK%i4xUCM{xK z&9PW{ePstUTO_CEX#Fng zs!K&l5LUd=dT;=sV4OE253re-@=zzAK z&r9rOR4tz}G=Z_4Gvu?z^Y15v?Xdp({+-J*i;~KX&D>XKr$f$iiUuT%j#rEPXjOV+ zn$}rmCPpNur(fK2QK00s&RMjL`Z%~C>H9X3iYeiRJ8|ny?k}sROPgvelgsL7 zygQ)s8yw)stL&F~we|D{M?V1$y2BajzVKS8wBy={^WD6E%jov-pzR_EE#N(D$D@69 z^7YYKzVc831+k^J?6ahKeqL=Vm-|f;6tOJGC_zr8$o_Jti$6L(sE@J9blp7}5imWk z=`_e#5MyQ|TQS>>gV4d;&|uuRW5k&7iDY^nm%l9!l+(^n{|fwpO(R6etga3?H!|9) zkeW_Ijn(j4ra?ylNxEZ$0AEchjnh5`2~rpV9Z|SFD^$675o09^j*7Ulj;3e<*8Pdo z<=-`$5{O_oF~W>`F3zC<(EjVI0!5R?I$HP)Yly)PDP5eMtKxhQ^}U!)yqi1~^oREL z4_*~=G}basZ&2~?OL5LDWf9HyR_e@F){S@NA1+#aDO0{^$5jsH1z>4`lN=QW|m2P zAnV;{GEpJq-eLE0AEC&o=Xt1KJKweVB$|v4f3^+fzgnf|KffN;FPlNnx+gUOxKAIzNxeB8r?CR9F{rzo7ndGlt_=OrF;?&LFo0KF@>!l&Ivo7s=o!`l+m-U=zQfpnkk;R4O;(v3djwAmT&?qT$o0uU_&M z7|-dV4{cr&_u!d|K^vZ=C2NQ>%yVo$CnIw!Z`JWw6_lO-oEdt6%cA50AbY3_^9mw2 zp2ZD!I@Q0~stujt*7Uga^9x2Ekv5C%RnXSHI%;w%ENr&hE(QENN)YoF0!N|R=BPUo zez=!VAP-N8Ziq1D4i{JPGhh+#fd8n|gC~*`^6)}U{#kT>GS$&kL6mH9)U(a$ux85A z7H#*2j}z14yP97crR}~G9(~l^Nnb!n>M&3QU;CZ9%*E7+8ryyb#Wk^EYwM# ziD+6kch{w}#AV5jEEq3@VumiEbqVG-7Rfysc{sqX@;LQQY0M;QYs2SSAn+LYVp&kg zalA7VMyFLPHG--tqpD8n1^#>gd}1d=Dwlntmh}rR=GnQHN-?gKM;5<}*e$5UdIK@QBQFMNw&B5G& zEJR>Sh`#xP7E4aV3!3;Qv26q+k321dg3^yu?G>LP0HKUZDtl5=7$!r2mFLd`t!MSw z%+cHRCv)>n$~2Tcjy^ul+uT~t*s73bJ8~wHNr8i(v(s1Dd>8^)*KPcZ!PIvZ6(19I z69~C5Z#q%ly%u`Q7=OIrw*S3HJCPRm#OJZ+;)I?WU4+m_>*~k6O0C>S|F4idO;D8I zTeZWBcW=j&z{kdb^k`K@OChG*H##nDF&v$aG+Tre$O-I?EJL1X3B8s^WRV!xB`*Wh z%KfBvJnxDZK5cBt^4x7i)G2BZJtOMJf*6V6HfuCEd|f*_-ZIyvyL&XNQxDs3_?j(N zC?I?#XSckkb4qwtZ|Xe|3Ya#>E7 z<+SlbC-$#=ADBdZg@^3l`Fh3@IuXHl{YdA$mm;O4L?9&O3k0Mg99)jdJ^`-9*^&oj zot2_?t4@VkteB-GIAVszQVb4Mu3;F=&TA41nNnfKI=p#vzJ#L@N>du-tB&Ls*fHCXy$ehI4+sO^1MmJomYigq8Iy*(5+- zp6vT~x5tON*?{j}n-~IyhHvJ@bt`kWPV~HOD?p~Ev%prvGL7d%+nb5a)8#f=^j*#~ z^i2!~B?#yV{_pEmwF-s!uP^ikK|aYw+9j`pcCZ^*x;#^;RN_VDD=o`5Uq@-;kwl(& zd!1#Z2X4DQ>#PX5wptb64^97o@|L|)3PE^`d-vjy4Sa>hTv~=U5`db}>uIB9koZl7 z=GFB=j6BkJSigAx)1b=Ab1_2NnQF5YS-uc*nQDBFm%h|p3W2JcawAt_aPR7w!WBJs zUjokF8*Uo)<3YyBOiQ+-7dLPpy+#pr)x@SWHpwslaZp{bP5q*uD$7q_yU;w8jk^Zb z7rfI#eeFeVi~dgd`H(}7$Zc1rEU%~jP>te)s_b<`MIUuI(osD4idaU<01cfscw569 z87L15E7&7n$Z$|w?=$SXOvIqZR5pZVHww>V9VRYILBWBHGfz*zD-8HPQ>Zp)=P3+~ zWQkEcX=UYt^5kdqmX>=6c@v7=dy>IB>B`6RC~@AXVa?;>>U1XL33>DGh}i;fF|a2q zH&IZ)8$I}>xHXDnMZ)`c;Nup|s)S{~u^DtNsuh%NvD?9-(5+7@e-abEs=kV+w9%`T z`cTtBc_hn&aWce3w(MODr24MYO2DtJkpf;cI9!-FON&P5OrH%~*gH&8QPm0sKZCtH zR|GlN4hJE*SQpWe2o$f$=(}BPJEo)iNqH>yHCOo`8%w0=@xbd(0?w?ra{+fpcNfqlIoF_c_LW7G?V2&y zjgt|`X%ilgQ>o&+>eDeYA*Y(h?g)T1wenCu@XgRi3Ef7=l_);ss})GV-o%8aEVlqQ z;$}$5QGa67K!z+1;$AiL>W9}vz2uX!)pOyS{V)$#1}kEO^61J9F69kxLzi)F0*>dN z^J^+8T`hS`aob5xeOt}Cw47{lrvzVgmm1RhG2BBGBHMh>v+f!=F1(XNeF}s`m8FTq z^U2u0l;*%E<=Dljqa?SslMX{7H5-e1I6K_qTl$>0yuR^u+0A-BcLe<&z_(DMz=PQaAl6 zSfo|O{5J(udE*M47@UP);NJd-rCMBBUr>x*uhPD!UiS%zo+#I3YL#y*qeN2 zXdkuMTL9OfRX0&^oxzgYFNt?F2;O%Rs@KyjvSnZs*6Lr|BX^@`^L_DL|GATVCT-r? z_jzfwhJ&dQxaXsb^Qq$yBC_8g3&00tG*(*EySs24EI0aFKc^nP{o4G*XAd~sQp0*U z>H*Qc1$wM*N%+zV2_c5qg&!&{Tc%!VB`@aI*f@AW^PQbku(DdC$=$fI|B$&a4i7g< zsJM1^1fKFtYMR=oQe6XhAFlb=9#vSAa{IfznvNwC1p`P=JSOmJkcuOR$4=EW=oEM5 zi|y;Kf~f00b{_^B5uXWG(!4h##n0`01#bc%k&@x0bgU}j!9L@ASdUGNs3Mm$UBs5Y zZVCAOvQFzRc=_^@58#z1SR5Uj6GAKzN{nsF$bleI0SoOv_}Qq61IoXBYt|VTW`AQk zyXO)oWrAsQj%w}mqvieeBF4p=U?fLA^y`)IIKGnpXvfPB77vgXRveO=&fiCf0n}{Q zJgsWW-CyK9=iMo#;8ym+VPL%A-O~k-f#s(}fA;n>hai_GU9bp! z1GgW^ba%`Cir^lT=QG7%P~Uz8mdoRh0xJ16q$tfip142GN*_Fr5maVf^DIWJze6e` zf6>sCF>}-d-*%^i>lgl^z_ncsV6zf%Tq+%!p&8~oH9Jkeu(I*drA5bO&F0CPB5A1Z zbq8`?ab=1}3W|uaHhI2MLF$R4EnsroJt{9H4-c@$vWq>&p5noiSHVg-cj9bre>;*G z|1HIDy$r~lyC>6E?@{kh`I3Xvmcz2FEzoA)P`lDJKF~8YMn@72P?aIhdyW>?Q^~TO z|Gu+1IH(an^dlR|=CDiy%4!vIu*@`<3IY-n4W( zR~e0_U=U&G$GTI$*M~QK&3$%7gc-vKN zCjO)NJPX6B?ZP`hR`Niqj3UakrHU#$)lOZ3A}-lk1~Kt{fNzqLgSK{OwvcUgXQ-U+ zF5c_l{g5?ZEJx?w>C@^Y<;2@HII*a93*J<^8sQ6kVZ%zlR5(e*bWL`u(dC`&+= z+U1O6ZtaV{W&{{WnFEp8@osh}21pzf=T~74Q9j0f@vMvo*S2UFOM|%{f-)ASZIBzf z@Wl%#%YtKiHZ{bGS0gwOzMW8j=0Ym8E@xDriUN8T z*H^k6EzeTxm;&?AaLyX={?a#8HSl6b&{*n)(xz{!tBM`%-fYe`&T=~KsZE@&&C2GT zJ10(o54g9zaWfGGb=T{d;p`>x&kr9nn?J|siVnW9!*ZmMOrZkiy<+I9!Ggg~dOT+I z@IHiK1pCV|`70;_WEfw5F~qZujNK7zh_}9wtRN9({3Q-Q;^$M{M004;&n(HadA?uL zE_~3FL`}yFUA7@E#j6rxICmbDlGXIIBj~De<;EfLI@ypLh-!O4^mKwCCRj>^fY$qL z@zLsJoCV!^55l$ZorYZ2IEJQPb$w%AJ@KQxgn)P7WSsRU34?gd#2hUU)qqU#x7HGC zp9pIaqg+>ef}2p{9uu3zScQzkTI7qtDDh6AKr;=}lui6KBP}2S6l-{P5KAw(6Qvbv28g9+sOE3gEn)9$+U3 zNJ7Nx_md6@69J%Z>Rp@eV|?*=sjFqG_OSO1aJ5k8)^LMj+5E093bKt}RvHI@782`L zuMA;EyAW_vkMHk!LBz`&7Mtb;J*BFE@TMB$I+2TerYBQbMY3Eqesj}sGcF-+VVSGE zI)`-AT+(i-RC4!%l^|N6IEOhgNQRPsc?^6s${-_P0fu!pXSfM_x?bH)wN{$UEclZI zZ4HQ1MI42gd}3}SG7;^|@?-jenCh{epK8*2IzY0%U3di<3 z3DJ{reoWNF5_WWfvT7=eTk|<)*A-?R6fqDt+T@ly(!4OQmYL#B{=PmLzMP(Sx=wyp zc%w(R#US=)zFq1IY>ExS*;R6h*p!UVlTi^YlT+Tgqh(y*-NFu+)6N9_>a4a( z_Ia)|m8?(WC}hl#g;m4q-$Wgj>H1LawcDYD>)y}IL|WCFkk%ebb%yG>x^Myx8b>Qy zG#~*{_o3CNLGgZ8skpr&fOvwXAAn4T%tmAl$Sup`Jt1{%5GpzeK^J1ExknbHh+A29 zV@{6v+$U3gh8QWMN(FWCq#?tJ`6gu3&k-u}*(FrzyrT^isZl7VsfW(_?9J~rXab(OQ0BH8#Ha4OQ*o=}GLH3yg>!q=$Mpr_uL?Ffc3uuPe3QwcypUGWAi0 z?SW)6Xo`rK`mXLsGQ2sgwZS^TmYQrP%_dbuGUd5I7P$e%s^rJzRO9RAgNYC5l<>W| zR|j~W2j536J?YU%zTn>Y4lXn1Un_v>jCDqEPR7*0k#8S^G?ADWF8}o8?W>lLVLlQ5 zRiLv7HOw2#~O zi4k31wUUX%%jO*kgTN@zBlmZ;*n-*qFcicTJ>-!il+=sK`Wg-<1;glOl)}nycOS8- zX6gJMI*Bou z?{Pq}8|cVrGOPuoYL%+6zJr$O&HBm`S4t%mW;XlncIE`WBNi4ImEo0Rj1H0NHqjgi zL)}ZU{l=W|=jA*+LwM@%Qyyo>ab>e)_cwrOIv&}*{2Tp+B5#&wn6g*wW0p_AHRH)= z%ZGfK5b_K~#QSmTZqLLNKa_PKKk zU<9GY+@)(az}zmN?z+<1uYVkAvHPC?xF7I#j~=TwYavs)$Rczfos6gS|0C&|11f93 z?!DPH*)`d=G1)cQo~+5PsV3XDZQGn|+cv)Y{=WYYp8a5-jkVShEhdmvDs!xJRA!N3 zDAo%2v2~Hu@~Zmya)!+=pkQ2P({wAMWUFZ+Y*!q5FxECYP6DsD_NcBtsQ61$$*wY$ z%eA3h$E93-u7FuZt*chzzecANcz~=oDSMN%`|~KfxY*vzxf5)=vJI=J@p?g`n{=7Y zVPG|=a6Jp(@cK{bQl7)K(6loRgczcxrT6@}`$)D!=W!o@9mSYWolmyY2!s2&D$e&E zi+e?tJ57ztrTN@akl?-6ZR=5PJ`H;EQIMKE(^XntyzEfM0VL`Xu*@$jR2j@acfd=n zlrz7U4>)y8kwM1SzwH~E$+kbPIYbeJciWDp5L)CS*!NVROd$Cu>#BeJ0Y@$mCY^5` z)+_ju;c~dP_Q=ka;#c`8omX9y-EjP%qfnhxAcf|lFQ4jFicDl7?iSTX*_36{cVlaFP=h~l!9dQrzJL!GCA{z&Vp&jgy-=EOf zPz4Tlte?jH6SO&5-;mB+Aqu0AW4u7>DlAz4w$3K)LXj zuzk8{g}pJr_PR*7&i&LzG!Fn|Z+J!04{H_YHq>!|eEijhi%9N_r(cIYP|Um{9!~mI z?|5IHdShSnG;Wf2`l$eW%vdSL>iT^v=|@~LGQcmIe={TC`=tSMjCNpiG-)e(tx-i} zZ;(jDZP3)8KjYX3;f8vOXE&Fy=hFjI61|22!vVzvVHnTUIJHJx@GlNaYTRv7|_7+m5TZ{+1yt4 z7GSBA4eW5i@Ne7_3gzKKLIYDrN}>EFv2M-~$%+6ysa{^*-$dl$A=NJF5_c`a5BlwM zQNDQmtjIGfC~&TXGIx*PG>!}OybRS%p*&#wKCDC1zFt1Z%4iD%tHXf`A#vV=+bSMWSA;d(o zt+RfVa4f5}BtjsgKon{ms^fDP62(EUzjCUC$ens7hXj50H9&uYP31}pJP=Js*MM~r zOOOyPMGp&Tz%;B%@^GjUNhrTr-I3RebCam6YiO$8wD$u2tF-&UDz+ATT_Rw!^lR=1 z?yeo(cf-@~5|gJ2qgg?sbt+As3+i^q_= zP54ld{KU8!VQN0j0S&e!K=BtI{aKH7dg+4E|JKwi`OiUrjSa9Wal5rUci#CN!fVGs zIa%#q^$r3MzYt`MRkv@>IED&TMAuY6;|Me-K|BNnls@lAVBb+4g4%7;O9lfw+$0n<2ipp zvu_Z~2=ER7d(9qQxQYq9Ws%Z^$>i%b#0tEikUl00z~}k4$&fZdtaqbI;}V3|)V;$u z+bI{wK~;(A4K{2!{!=wlL>Jv;Qf+g^5$B}(qn-yX)Z5ZAMT_Z&m<7|zNgwYHb?cIT z2#!G7r9?v7*RmhpDgzH0hj$t2a!jywlBtdb*G`pE77v}EFM9l7><1iGP+)z0b8~6S zbSHhnlndUMJ>+zBuL686B_agqt1Ew)CmSRdsH6%V*EcIEi7`?!FaV(43OumLgL?h96b%mA$(V4k_d;ycW5@=LmE4S3qK^932toVd4Kqo6_X;6AcV5Z+LTE8j z?Kch7fwk*PbfiF*{Gnj?+rd8T*Gui!`Y=gVNVN?cC|{FTuuMT{;$PY`dtgrNax57a z{U$%BQjP?QLH;oyPhEQ(YQM6wesKKdA~ct2;=cLl!!M4o*Y;{71A;h-l_9s~1NCP~ z5sd*sBs(euL?kU2G${ytm_g>^03kE-D3d)!%+0Le2V($nJKPsH0_jQtk5s%PW%Cy$ z9uCFNeA76vv?x}AxJa?Un|;NM(cwGay_3+8Afs^!xrok@eH!VLy$mbfM77(YM=~;|5CE(S8)Bzuv{Yyumo??9gJ2_$I@{BygDpY zrl9B%^WzZ>$)^Od3p_Nm^KE=3DDGy1UeXcFt;oZ#XC{Cku?5I*-eu%p6{}E>5gve6x>sinOjyu7tVXHJ#D;Kk z=_v=mpol9on(%^MqXxIbivVL1N@e<~KICXPThGlV`9vFxM!pGah?aW9+9i2r_;(0{-t5t+r+uXO}H~%P`iav2j<;pG? zrUAJ6I2RQ&BVFH}NCtngc{e$nblGJ`BHclvVD7hG*SFu7XY!JiHdHzBN#M1j-CY0Qt&mxwaRqC+p9Bnanef}e)gx;CX<~MFq zrwimYu?V=P}7pC3v)l&@6Eok_Im>axFk2-4Trzn+X7bQXv7 zqdj;#RlgkbNrduee<5_ayUR4cv{Gy$qD`JoD0FRdq9pJ9wOWVV?RHliQiSYnuXR8E z^_Dnj#F84}9a4p!^pl7`ox{53E5%UQmq-B^Q*$>zw$udti}d7eAf3?M-apT5h>vu3 zB*?(`G|v_v`o1@!8YW_EI9SvB>7zFVC@5T*Bm9!oE%y9NSs_HZxwejA)D@g8HJsgN;n3W=`!g;3_6U*k(%9RTkJ!CV` zqcC^ue_SUO`QdSnSM1#W?IhFHf~lK6frnO6Ep;|K;&P`ZbzB@0LylO!?F~cL)4iXJ z+5>QOKL71CFk!-m3ak|{ic2sWg?@R74tFXRXG~)?I$f^eiL|}yrTuz3C83C~y;?H| zGGQZBP8mcE6__VeEogyOX4t%Z0+@E;In@YHRm4zsD4~RIij>Y?0aWa!C_PvAjPgv` z+qW++MHj=Ms*YnKpm{b)ySm%!Gy-BvZnVbP=>GO@Z<*4ce(+cp7+UNk1fly;ZJht` zjl+dLdNF9{vnuvf`%?0A(ZBv{B^{@+0!Fym&mEj0vc`-3VLO?9yBlFIl&(L#8STo7 zYDbp*>D+c(w#ri}VE^8&<%O~@jY!G0h=3j+YQ02=i>T`e7Mb947b#{!nq8}<-th8j zgk~zmIFmZ>d-N48Rb!(;5?Q(^c?uXgW$|fi3?6PUMLp-q?|_Z2pw#S=+$%cH=4|RK z>9XhV#>i=)CYrD`Oz;VEvWi%L`Dj04xb*&5p)Bs`vc2qQ4IZUIr(`Gqmvr-e3DDe? zAi}P_=r8UMNSmfA`iJvK*nxU{G-g)sa^4Quetx+J5G7x2=?j?8#vEm(wH*W=OcEKO zSumv`h@-7caRV%^=Igwa)H8(QSn@1h7?MSOvHxb4d6ujjMl#sm1_&(4RS zX%2=5dkhfrv+hQnhoV(SH^FABx~e+qNB0H4a_eY4tEHBOeY6GJ>B7OC#r^kA^4Z}t z+R8-RX%m!7hDWW;Tr)HkD9J%S@L)kbS4c+jQ(!;$? z8aT-$>lcuLwV5jc8Coqq@3_mO+^8%K7H=|_V|9ttY+pk667e&Ksg$oY-T~| zN_~0dsXnH(O>W87EQH@`!9~S*;ARGOHNJK#$=uj#kJ+4yw<`;Je>R(D9g~=?z z^T4A6c46#RC0mQhyuuW%UKhTrCzn@eT%R%C7bsrL#xi8VXm7m`G83*RQ66nF|Nc0* zA$kmB&2dc5mKkpbQ{2TIoXK7B1P_u>U0i%D7geKKz;*V8tvWbbqut;&$~{N#ZtxtS zwL`FO1@rq$Z@;_TWEDshB#3dw`_PpEkvVDrnd28#&~R{)H}bg%nWJ2m04MHy?I8{S zg8)9~#~SpXwHGjreePgUHmT1#)0;~-3RvhSKRGtW<_U@vFpB2SY12)#qE?R5ydHD= zG@JDf@4KQDgTES!rHd9VZ^Wf8U_l(pmxW|_(uHlvjmE=aft&)I(bG1{=AOND4$img zle3#`BBxq;f^Ph?d`hMvVH=EhSpWm=9S7(r`=~djyRn_ToC#|Er70=8^p}3Jqu#?r zeS|30iI-N7N2CXEUO^a7upXh@WW&o#730m)%)4+$`P~vau7=-aF$1|bxxHk1{|)T2=Ho-#;w5pUQkE{8r;=EpYI{42 zANk-Xf=6B1&iCVqT!{te&q$J;p3mN#HyV+*zLupF&#t2eKF8hEqX?cYmOFnVyZ8E8 ztIL?aU<2vlD0=dDLcU?pptzmu3eqOHZH=ItdZMpbW)?kVcK$8Ry2|o?nbq~N#E{%C zgJ>Mxg|vmxV^v_+yV{mko!PDC8p!4dNFbhON6x%%TNb$43S3$FkgfNzJ@BJ3`PNt=ivzH`QD;$hVbV9^)^ zxKF6nP%)jZ`|fv@w^(tV+1Fz81EqPK`)Dx{m;*?azZ}8j*zDq*hV5}Xx>kzH1;{2y z`SM03|BQ#sQB-+x8M3Q}5_B|M|C&-QobJ50jTGJxGcP3_isq&y-;Cu@PAgxV3hhpw z>)tgZ;!baJ+c>O`qoauL-K%rg;RqCdKTBP?D-!$i<~s=4Fb@Kg>8T#{pi<*hwxoHj zh;_V35ah1N0gv~DO<9-VGYVr@ZM95|V#8-pD5A1VorY)?Ml|s2Apn5?;hhHd81Qy$ zbX)k2F?bSryx!1evu{RGPXAk<4LnoK)*3Rl2PB+f00bshhhMC|A5{lc2x3L>%ypnl z3~7h@gs6Wg+FM7=TuOAprUN|ErAti( zPJUZ~BKgCBTIXh~6HB?}pgzhCkj^)YnCrm;JIbn*W-OuAM`MyHs~l5Jj&y<>S4-9_ znJW3Z{84;;1b+1S^LL%d)&VRc0Yn(rIxnd0f8HbmOCE9AQFXW+`6nctBjFp9KNFBF zX42}GEaVrCtRJkU8$mDRfY$GRssc9&8qh5ujC}hJA1JWv{us=zuFCQ@Tk4*csyh_e zxaPRC$1vSbN^?5BD@ejk*t|rdUlgrvi&ds}>U0_Fj-Jf)xk%`?(D0}0AcbZhbpIR5 zazSH}GI?iyasoT`O+_cTLVBgc`}j^DK~pnVMUp*{OiVBS=tIflL^wJ&UI$A3ED<0% z=4i|cGZdT?0?4S6^`vyd@}m!u*n;h*m2$}q@t9R=CUpK?0(kP%wj{_wME;8c*8ALvKY{MRwJ!9NGhBquyi!daF1|!{`qUL}a+?AVq@dL#I&VS(k z;QrA^?7l#;ApP|NHz}3TvFnCw=~_3(B_@fv3#pt}I7vf+#nvGLa=LDlDle zQJMgH&uDnF3sH=<1~(c&Ov%poLzCg96i+#cQ#&%W}EYtDFPHpTYT$p_ajjC`WfF%Sme*V7xrObJc&x!+z6$7O!D@!ZEdx&9>Kt(KVSu1r)?Lz7De>f9jWRtY% z3!*1Hur@*dz5eytvL_d^D|Hrq9a4sGEaass41t&cgPFA{FQ5LpAw9ecbJU=6n zQc#xuDkv3JRt)QRyH=&hFK6FQD9xFnoT#j-N-e{4`m{aQiA@#agF4KBjmv7%vy<^N zjr5_8))jsFOh;~|iAjuQvA$Ci8&%*T1?xp$B0z-{fw~rL138V29Nt&CN))v>)Rk<@ zsfS+zI|aNp(gJL|b$Dob75-#RUQ2^wa^d~X*e(;C>t)_AG*$^z-T{Hxtl)9(A#L2~ zF<5xC3)<+Vmm6{}{ad54fq3Uoy)vJ}eU$>%TA zg2ZuJ>#EG#D`!uii=Tc?bYA^?P7}URK|Cn7C@v{TvmFB%kM%8681X-M0Bfg{iBT;%SAc?1VFW%#1=klMlC%MGF$7 zrzW)9pr(c;<9{;IlU*KT)y+&G9L-mG@q3!?x{~Pog(ldmGT3#=EjIf=_nY4=oXSKn zY_m95%RtjGE(LwMyJMGlfA|Agw@Z#zaj2$C)5gG<`kq<&?5+)DM-y9=HqSr49fzk( zPUNQ$%8*ni_^Pbib{CqQBTpXOm7G6v@M(iEpwdw=3FgHEfC;^phgZ{MI3=LvTV(2O z3)V{r;y2yZamCpQ@K-q@od_43ObURWmt#hAv^nQ_B4Rde%?`^Y%Y>a@^f)q+00H;N z@cWU(m;3z+WqYGh4r27)sfm>jar{%oQlc1HHtviu&}oxQ^rx}xD1a1V_jlwA8A`69$DM8A>= zBz)?$DH?=QvCRn1PED#TRKA0PJ?-tIy_;q4vTsyzK>-#prQ;sFP}*}^ZUxr8k)~2r zKDjcm|5O6cIxl-m_vW9%7yj$00|+rj=&T8XdoC$J%Y}xOMfYu%9uW~Fe|Fx7t-bIH zvS>3vP-Ua*6B-%?8le@`4Rnr{UMJvC1q1)gs^&t-98?`gqB*n_KFg&MdHMPonT3(5 zz8a=AJmFHfjx`6!;FkV}&c+;Er*D?Pzr5HdMt30rZb^|n@4X#KAj5;z7;gnp>b(k# zOgoQ5(~2V^n$)J8tdN)Mtu4Aq-!klZez93qiNp#EW(kv`9Um<7V(VO;UJaSl|dfIOBls;cuYv)!hLfTYlgqn$3`0Z4Qv zu1hT5<4K~xbnwe1mZWq+Mk`8MmH@|*wwUcq&1KlfXfV&gc%b*|vwH)saHxMF3*cg- zhxcvwVaFA^fv3NFiLb`$Znfv;tITftpvGONX@%m*UIQPgyrb-K+(shX+wxR!SY=9Q zs-jHk#vNZE+Phiq#y!K|pAf6c?26mow7)F%%hUZcVVH-#JaA;wc2IPecL@Yw%o^Mt z_=33^*d4i9d3sVV%0PjQ{6PxJK&H<=p;3CbGff}t;;thbY}-n z^58Rl;rLpZ5e%+(dDHl%jdb*l^bvZlwI{R>F`#VKYpU~~ru%Y#O$%ChM^hvfi}i;w zG=8`|k%#3i(h+!rAXTCtXvjLFr^kAVh9O8Z5h5Guo4CAM} znLcE^ZjWp$dNh5y9Qu#O z(k9DlblIOn-@HXq)UX9bBgL~=nV07Nu z6K!7*OT|l99Y`^lOBT>D?<^j6M{kOuVAG)3!t zHw0Q)SgKowvFW-v1G3Tt8|djPknE(1=Ot zP4z`8?X7tmP~losJg7;85lgA6f#OqeOCc$P2E+2?0Zh?y!)<>(6NvF z{)pj<{I^r2`2TEjafzWHHr-R1Tm2I^Fn7~l9p)X5dib^COl9%U%-v>QpGePZ`{+WY zjPx$d1E7Xq#y6To<`a8sr3lRVD%%Zs-g+qO1 z>-J~Zl!)I`CAWeUhNQVBPeZNVW5q->D1fZ=C|O~go=!oEF^zLUS)E#63wC?%i(zz% zajnKO$-Pjz67u?f_l6;=Y3r(C9(rsfv9X1^JOj?oRb3D`zER+QAOhw9jmz`wS4ad= z!*c=fd%jP-2{Z#>b5Jl^N*k_m$9eJiO*hmV^1eTfQrifJlF8wA?;-zk1R1wrLuFBv zZ2alNeRvhkAW&ocmQXhml~CW9=I+RU94e8wy1bkw6#DhB3lc38OJ2>(9wkqHc3CRi z3G`0esGudn>2fcAG_!1{)hs!?uO66mXLc#-HCTTh6;REzJ-NFP^y#<_RL25JPR0n_ z>^?!|hmuLvv&TLk6@m(aliB1P*bx?~gQ8F`F=WmkYD&tEmo+fmwY%Gu?Nc#iQgI3L zb{%U)lCwsMF(z*a=(&|M;~PQdR#>Wu?U%2>a{GN-`%oD{DhJrM6udNh+tcfm_3v}x zT1PM-vVZ+KzxBBqBjJWx0vTZ-1*`3{-4i@{WaIZkyYGg46a*>m8y~MIE8Z*6Atu#W zU%a)Ek(G+bg`d(O6~PVl{FZKgVvrmj2+~2oqzvH|RiAI88IeHGe!IrK9gbZ75xN8W9tmc%#1bPhPZC-d{$@%{t4!Bow3St7LUjEA}QWHuHF2x`Z9J#4SV+x+gj1OKGsm82EhCp5Ksmd#=y&z0F>4XV?;R^00SB9}8O-$c>cZc`)jFIZV%F zAM*Ln@pA@-9W%exsIxMTnM&vTJZ}e+#iIBw!E;JW%Z$GbF?+PPd%V2)BsV;~q(k$a zm3fZnh2E)1TO#7AI5Xi6ih8Xbl-a$TlrI~86_xUO48HifDaKXJ%O&EgG38jLqPlyT zoZl-U%SHWKY6g{QrPA&rCnZFrpZQ327vKQPxbG?nlu_4@zZ>gYpsHLb8IRP)*~d2R z3jVb6{Cz2UA{RuiK6dc&Z(-qO_)zRvY%Bn6K*IH+cFsns$4LIW0OV9&E6?zO%@wV} z%HLn;V2Z7-qdx|HK%Nl>?`zf=ZS8Gv3e41V*VMUgR(CX4$p~|Lgjh%?ag;EXxy7fj zJ9)2m9MUpTt9t2aQ#2g*KFnnPg6lzSnpyU8zN5k^&Zx1VL7tELl~8YX>JG14AdTtk z%snv9W1|tp(>%P>DJnZ<3L;_AEX*_Pi>Y(Uj5I>rYc(?Ix0pOm(NzL9*U;%_s}m!Rzz5X;yF7gUc=f zTPsR8Ew$n25VL1xOwl`HSb}#}E0FrbLUyx2$@};q4>UbU_w0~fX{dK9 z=F-}IE2oYOAw?!S&o5b!DrZZ?Q0+X^unr37iOHe7n@V+>@EC^gU}^s`y_`}8Efz}Z zrS&)6%e&xzkfo`2c7=0O-bngZ*+|%O`B`Ga;{!D@yW{9T#wos|~{1+tbU7J^NCt2QfNt8mDIN*+-|Jl)&0 z)~BC|nmm+!pQ@$p9$WSK4sQNd|#I{DITW;lD`$I z!_lrM5QL{cXTX1aR=!+ZkTu~dE_OV53gXw#*$xl)wEP(}6Avpc->9*#u3s|c&!9$w zY7tCyty*&Dp=W_4{!BQPVG|GCA1R{Ne%+sZoXII*jr#{z=xxKx>%Fe>PO6%l-FZE8 z4U;`}B`)E2d(%vrh`P#W5f6hhns_i7fzGJz8AoSsSjh68et+sV4rnKxiq(UZp zlpS9CHTw0qlRmlCb$T3nasfAk#K*!G_U-)%nwA$o$fhXj_ssimu2#Y56^kwQsvX_w zq|~!ScIKO;h$w9?7ACHljsDK!3#Y&7`PqI8=D&>8Lc^(S2Xec->q9&1x_$T0V$N*R z9E3F}a6OFXZ&R4xHnnXBy?=2kb}hSb)GP*5i1CtqYvj=XniXlhZ;_B72i2Uv9d6~P z?Cx9+J>9N zV%-ECX>nflJAG?#z~wdAi}N5^ie55+no9qShIw9&QfZ^d><^JbWoI9uI~4Ud)sqlU z=Vp0$PMi6OmfVon=?{v>F+Jwp5zdg1jWnNp91xKZ0t#+@OM|=K*tiZ9tBJX1YE?M_ z34|=NL5DW`!`^IILgsRDduv*@7VQ=l+qzMD(lBrmW4Y$HHRcWt6BjI9VI2O8oSRbR z4xmJN4b&@vcCRRvdpN zgM=aKkFOZaN#7Xd$4YcB}s~&bibNMPIa{y%1kO*QFaE`)>ra$j<2hXIW>EHK5_8eQ+x8yIc zX2?saav4q)v7FTkdsGZmOs;fGnVJGHpcSSOu>{Yp*g{iqu$)V_HXZvr?n01Lw=&r* zh!lMUl0@EkGjBZ{$0yWACA6a#=jS1oX`x!2-PN>f>T&)2C`anPajn(gh99`{2<0BYkX6!O8p1Mip zZ^li9936S;y3(T58HWSjUu6+mlyVQ}GjAMI%MpnaaQ>MpCUVY*$-}kHjm)^UbXV3} zygR5{IRe?Zo(hAAZ}dJ#Ie(go&K!hFD`#WG!wyBDEq3$NxE2Om%F~?3*0F+GN-~3j z!|ngVIp{W9dwIS4^wK*M-MhYEcKyqUX+teh@tC&AA>*X=$Qu`R#dg&g z{d5$`iN2{k;cnj_S(-+opN>C6%92e=m?yt)ogxU8iCNy1o{G8?#eNp;&pzlT`S_Ql zjr0uT+)ONUtfUvc++D`oN!aFLj3qtANr7DA;G*;NCOV(;mbQqnz&aaINqrW6ZXZoy(b&Dbgq}_5UD}ea- zadtl~WOhZ$=FJ(L_K8_tYLk0R7pGqXH+06c&} zhDjb;m`q&VZx3oo3_IWNi07{z$vNk^Yrl(V1{9#{s}}-p7Y|z-{0h-tH#h|~Le(Gw zze`tD{k!cxP|8vq8C<$-US6s=yMgl8ZcgW6Zp2OElL?4_Mn0rYDELcUzfOg$gP0b} zy@3EWB-K6zb`!wVVsH%r17PDbaS<<%yfI4h&vV9he+yGFSoL#wBbeCMOv2FtY`5ee zqy4I5vd6n;F{uiszyqcmY>|Jo8&zA6(yLB`g(=yw9Lus%tlFmUbN@2(I^h2fu{IPV z9Z}8avcB2{;=qHJVsW)|(4WX?1c<;5h)$&Eq>2owg*yF-?u+ygxyX^&1<}gbYeo!1 zLGvW6{x>ZjV8Dr4C9~6pP&IB~KFQ|p;P*Zi#;04r0cpxk10EUbl0r#1WdAxuKT5g)x7y}$C1oxbG$0u6xf2Nh;UDGfxu^#QsNw{nbiphDy*2NG z_Ruh30FyN(&nZh@yHf$yRym>8Bu(qVfM{Fr^G*>0SmG}aG1Z$7#!o_&16;nokAY|l zwc0*7FLZuB+u5+Ic*x$kR7Og|^8=6yX3yyy^RK&{PDJW47=X3;aTuM>uji9B@EdCI z)XRw8X*+~?`{eFH2S1+8gLjr)WIXA~ii zmES>z%KRpB+|;MX+2^JYGct5^3Rc3sIa0iotUiYO=}|g)D#3ZesHbq;K5-dMEuEN7vLevd3r^|2ni?G-gg9O?M^ zdQ#^r;JKTfkPk`XD*RE*X9({U?BGTRHRtGR4{5y{g;)5g4FRmmsjQD;w{_o6->)`8 zrWu=mv<>)n7og+CyBwK(RiebT0NMU{iStk5nFcB3FK5W)hz`WHotZ?9F549tNI>IJ%p2UZFw9m^ z&5yqn+DkO8{Zuo~)1#DBr<;-yAXY(v4y{RJr>jfpsKF|mRkWT}h5o1sE1{PXT^8C% z^Fawl+uoXTw4F@m>;3kMRX!_2!k?&Hwqscd)GB2B101di-Exj|pQpY=aCb&>fu2LA z6~3hW;+irIcgx|)QU&B%r^Dm}>Mm{9hPEFMr&-W4PWytNXXt*#0vX4c24B4af_lk2yg=fZ01G%|eXje$c7gs>apZ@#tzC=0Tq z3cOQX17ETo9uTPru^$MstryLcX7Ywe4r@k*kh1p6%NEm; zLu4PFA8l=*STv*F&s0MqJZ1%F8y#dSS7RK>eBa}QM?>yZqA;mw8x8k5LMGu_YA9LR zhFCu`8sr_+^O?7Vk&)vhZ}huU?{2B~V6fX{IKGD_-9 z7fPb#jOL@8OiJIQIEj$qfEm zRN)?d5E;B7A8*X&@_3g5P#GBpu1`6MiZK3u6e5huoM43=RaI(O%)P_C{f^=GZgkMd z{#sSeH?`~%+8f|vzkF9^_NY)G!@wYWOvoTf2mt}Y%iK3tW)n>Y^$sZjS*Y97UcPAJ z5bm>J(6Aa*#9Y}G@Y!W0sHmxyTv=_qjwn@V=Q|9!~JcblNWW;M{T0N z7mW~p?^;vJ*9;tm=Ta+k7 z;b<^EU!djX?H&78>J`g#l?~q>^&G`vaj5`3CYr-B+&9Ljg8I6qOrbc_Kc+M=G%1(J ziAJ}&xw$`dZe~(}GMteZt*|cLuC?19kYdUYMG||aw~s7h%7`B-Kl@q4w9cbMw~Brx zyn;NTcYh}OfpZcg$1A3orgiG;MY72PdV!i7vSV7i4|bpwdXbu1atT24bJT*|1J!y9 zdNSUFRLs!4ncG^;N@%4MFJJsS2^c`F5-dFE*=@Yo(D3;H3k4#}m(cg!KZI!L?TVBI zmB{Dst)ulS1ShAA3 z!3GaHIvXqwv9|Jh{}4(|28uUuFA}A=mlUaL{FO#=6+OYUrb1LLtnVK^XOwO0cl&MJ zhXQ#U2OE%+PM9=aU3Q#wzyySJ%WyyTBi8HAxV&Qsf`FtJ7bYb9V#Be4Ck^BKO&)R~WF00l}Y@46v(N{;SH9{ynjsCr48u(^%r8Gxl zy5>D2PBT+3>Umd|e(9G9TifiMR|1;TN%U^-4i#EK$$EWds*+L`HN1rG5V90WjKep3 z&$luNc)_Wxv8k|tX}-X{;hQx(Nx9A^`R6xM8n|KwQd02LRE;it;~`?^ZvZf`8Vj@n zIq0(c9z%26=w1dW@|&4t(reO^ImNF0H6I;id@`h+douVSn}gh;Q(Rqsxe1nEau00G z`Nf;#zZ_OfK!3V{M0C|IqM{l*n>dUZU4GXt7_FC z8#&oCrXYCnNK{;2&FNJsj!6s}CK|3YwRg2+QUJJlf(uE99T=fw^bSE05&~k9paAYR z<#UFcQ_nZgAFk(X(DASy{7trlr79Y&sP66{@hpmqNHsnnM9L#QAA2Nx8q*(oSx8}f zTyZ?`Z8xCMB`uX3ICXsN&Cj`u6*k{S*5{;K7&Trb7i6%pkzN7EtZyH(j;XI#jMZ5m z50{N(8Wfb;Hray60$D@VBw81BD|L`0-z$@)0j;tR8g4o*OwT;&woPcXlW;&d`Q>H2;V{~j)sJ!~2pdYwoNO$ML zLZLXP>Q-x4V_4|sKZ({n@@qHd*SBgHo)(U!&`1Y|V$Qd>w8Dve8&GzRveWmo@C9vq zCvOjyn-F_@mz$A~rhq-_`rjFlB%(C5Ffn>f`s$~5gRt!Hf8AXi9p>c#tQNOhkFI;b zL3%9}I-#yxgTqAqy+Alfm^=sd>=rf&<@pnAxIk!O?B9@}gh1mF<^u>(>@FNH+zo)J z%a%AGvUkS@--L$wa~1IMOHxpzH+>tL#2SmnMbw)BaLbuzgq-pod`krZZ2v~(h7~OR zYzMZ60lWgm_H|ie58rFf6`e*{Fl*yoFvq)~fslUOa|vq3zLb(BXOz%qy_Ti2WKscS zKp_fH*9_Rhxuvm~{sq!@!{hARBGPU)8bt+p1kTN#o4vo$5+-C_FHkJ0gLq{X17Dxe z`ubkCuwmi!v}eA320gQdRP=*K*?ZO9HMRuH)+GyWpYG>d(L4RM4x~R3MN0-uSK{7< ztlSPcV_6`Bu5$LZ?R5-UXX-X}W_~bXL!jY|E4@R`5(QB}N3r%I2Q$GH!j8Og!f^<{ z;Gwt1i)qqJ_BbC^Y>{Je4qjB!*t+5JQ&m%{>Me= ziyR*jTHZ-o zTtq;}2gjy2mYyCJZQy4UZJh@@hqYfMA`MN?PLBzgUnJg5FEk2_q8<_h78E$(hlKX^ z?@zvfz@2>vLS$1@%)sNj>7Db4I+kBo_I&J%T-Lg^|ibb#3bRWJeH z<z3HkD2OmNVlhk9L@S|Ygi?oS&o~S1aFI&OEZs>bH+?Zy zP!F_d@!5wl41nVB6lsanEI$E$axj*R00=HUriDI53r!2mX=p%17{~jvO|l#|tSEU( z)65~s75jW4NP*lvk5K(VfTU-Vrq#w3@P(7 z(Q^k>bm9!A$lULdxOXnVA8Y?L$3M1#a!fQ&xeVZKMs8KX)7{&hK)q?v__Z!~FBp!L zN8)ATWqS`mz=%BIkN3jVUH?8?-a8w}F{kM0QP>_&;1+(RLiGNTf=q;=33AJP4HBt5zR7R2VG$uUs|g=p-tQQH;Xh++YyM*y`a2)U)!V-*z3>L=pH(X z^vr9j6IWfd(Xa~h4u45wp+ii!cTr zv104`|1+(D6+d~(gp}@5QOKYJiLL`dh-aSI;HW*3DNYwU5?XY)r3y__)X)iE3Ucy~ z&$p|Mn*Km&WF!QH^L;xU&CZkAaEz7AvT3b*X4%G#&bb1(WYX<-6s|0$1rcYAFxE`? zoQW_`vJT$p90I$Mqbz*w{i0$EFhB&-W|?R(!ne>LAxH!sPaCdJmm9Q+o1RVR49ROd zi4elqZhU~x&(Ho4VanEVk`#hW$nWjkXG6K%z3jxfP1GLTTF zei}m*?tEpF=UO^a^mVDpF`(`J$8ftF7d{dous27ooE%jqtoQZdY5_QI^8#@qFdqzkhs$)m2rO_a}433fWm) z4j?tkInXoK*Vh^JyYLAJ4FmN%G?iA7o*y*P!F%Zjc74M*d$(+CQFRd;_Xm;PimpF)6xGpf}9Slif4XYqTUEmq#%Iszo3 z2|ItEC=Wlb$5v18w>?zV(@#x>3JT_LZCc00^*X=@JKse&P1EXid#!ihePSNW8YV=o z{$p7Ijr?dT6OWLP5EIj7yT`xYe0sCeK~r-jiC$ZlB0e&5GKJY#M@L6X2j|#J}rl-!M*`z#}Y<+${ec86R)8|8bEW#a!&hc8J zY+h2eI_!yic<>0LSaYP4N#Wt)0U(5zIdFp+(cvahYMYxmCG@m(G}YCQ_DxD1PEJqZ zgvxEcL&kziU-es&*AX)O=)R4D9{e|0ltc8HZbX;Yk3NPMv;S(FUEb6j-&nEm{VWlS z!5vnHiF`AL_sA(J@7y|SYM2U@LC;iIQ9;AT=CYV26BHC=WUNlZmH7+^2^o%85J*i= z=k3r$Otn z+F;?>`kt)s1GGP1X0BA@wOM7ev%6YdT^(}betmfXEvjhw!sTY?+WGu?>+MJ^X=-XJ z=um3b82C$)z3xQ|hJ}Tt$-$(irIjsM4oBi);jHx5eqX?y>S>GHbgM*-@+I(f7LP7x zS!+BTEodo>zZzHgzW~__CiJ&yD$-_>q)B5p?zYP0q`g$hzKYNR)g9|OHv2UOgF(}1 zNUnKheOSa~GOb^~UZGIz*s+7p=hxO+GOSu$X%?H!ZoJa$;20YX2xc;w0)arKQq_a0 zy+Bc=DR&(Cq*p#*VKXIT0uvtlx?j-b>XYzT75C`q-eI9wjFdokg-!nr%~E8?t9DZq zRa;xzm?rfrDT<;f${cew%V01x14kQIQWVvgCICz(Q*CW+$7lkeO3fCR=k(S{%FTn2 zLL%+^MoRppS(3_e_lqXz@I+tFJvsJjpRV@ax&o^BnU!5TqutrFXX`WHT3^{cVv;0R z--|2M#Yqmu?p@pG9iRA1)8m%j&meRMfg%p~UOs17kxReL#3x|v+DV%v63LAlH`=nY zd!$ej!z+7n%Bi>_J1+B3{K>xD;}iSGD{%|O-JBY09iRYse#N+KTXnz9NvYQNuk5~3 zqflJYyK~s%QV)t#a$IM0h)cK_>3bP6aVB7I%`?D}UHGG$;; zRDU_xYBhUIae5y(5Q$4ruE||eHMK7>CH~S(N!8T2Uw#ijT9Ow-uO>*HpI#Vr{v4);!YYkusWUf<~>DGrL=vo>zw z$om_JwI)yitXVpG#-)dsoayj-Y*z5OFS_;Zsl~#i!j0` zZsCYt&6L|T84>sBsGhS|)_KRixN5@Xw4!{2+P|hBO$HWFWs@b;I|Wqr?Zd2-lRRDT zo+B}S&`imw=?VXRqVdYOM@Iuh>@LKOJQO#wm)T$OmuALanvw9S-6-j<+ z)x`c5Oc7~Vl#bcw`+AB^w!PZlk+=lK51Ns%W&NEW#XUMIdCz)D^^EvSvw9UxW=X1N zBy3vH(`aH%poqi06E-cl=ArCgOp)_4%LRS-0MpBba|fZXC8G;jQ`erbM*K#2yj|irl!{3t)=9vwEJJGkfEaN9RqObYIFQ z-8Y~B7(UoXuF+no?iWnC6{?#zXK;n04n|cUGg7iD1wlbUuRJqT9N{C5@cy$vQ=(_| z7N*1xnkgAEb<^vM+7)FGNBG1oj*;Zr#-AEcA{U6gd&I$-4U-ab{HEs~m^V4Rho5=t z0|mf{NZ(q$ZjUU-LCfYD8GRBZa=x)J#Q4D6h_%bc_<1}1emdVnpzcctc&W%?Qp}*? z5k6*TcHTpyCFOdFf)L9xdU}*$((@(aF$v#4=jm$Kfv<}rLrdg>_`^IfY{gzT?=wn{ zJt?W49rxt2xJSo#>~OkS9VxKXMtzfb;oIGpqDyW2-eiMvzVVue@|guAS1+-o06hNc z&$^m|ASYGdIKb>Gp;#>b*X^v0hByB=`z3#$PT2oJj}4l{51%i7V0_$aD~xK1PdpvJ z`)b_i^Ks%`-H(#^%kw0KK5+|%#w{7&i|(8*u~6!L9{_(B<`N)8T2>#UN!+5C)r}I0 zd_5e0_$SM$uS91r7KwiP;IS6o-ot}Sz>CEYpvSpC64&6^ack!-ni#iYid8l!9_$yl zI7U+F5&OdsupA{t-re8?Ns5Cu9$yiEamu{uQxe`@Bp&S7yY8GWv`{Q3C`}r>ad)87 z#LS zCx7fYh6#d$<5te-qR!O#ofjn6Z%8ug;$n`Az0$2d8=<5)C_ZTxSWe)0#4VjEj_~cJ zH&2%X#jFoEpEzG3nE^!>6cs_o2Qe4i7xRgKd;||A1&WjJ6)Rw+s>-=2e>G<7O0mO|u1G26&DYoXU z|M;W_z;*=7NjxM%JY+!6%r5D1KmqXej`QE|OA4sr_r~;mvzxQ>;Sp<>-Q%uZvf)Q# ztu)xVR|aUaDg}cF58n9fymmZbKOB$$`+8i?$+(n1x*a7C#s^Lmhq@*FZ^?ZC+0F|v zl*j*`2SDssCiX}JWvKUwnwc>5BZef>AW2Cu7y>W_VA_FY7x(C75RBf=k^2A?v#I>a z_ot{_oqG|p7onucP4DVw_u|S4ZM^CWo=+e&Wxb9mS(O5c@3#B%*p571+fK&+l^mCM zN-Rz7>cVakm!SB;b0i{v@j&;urDJ=-qbNy}N^TUvq>|h$1Z4nakYqLqrHMnBAlM+- zVDRD=j|V}Z+ov(_gFv}$s+{|N-{k=czF$>OH&qIpw7K@0l@AYJyKGE*!$vW_@{Y~3 zabHxe;an^fC2U&InY%oG$C>zjR{+GNAC5~uV0DgwAmU>d!QEXvE;4S}IMAYjQm>D{ zJ^9n&Ofl0WZc$9!;u!0^t}mp=A4n6Ms>C_TFc~{D zwou{{6dyhd_VyB{lQ`HV?(qqI^2JUA#Ts7duNP}%>R(Ua=uuda^NliJlcSgLg%#sF z^}7D`V*GCxgPqhp-1o_<6l7HiI%%8Sl`PltB$qQJQk58Tu`Clca)2`TH#hT)BrXkg zNhHp}65ntL1QLkE-a_&4P;qns%@G#g4A7uD^Wv z1pOG$>T5u$*EhdhIDIKMU0M;O64)vkU6-~m=Nk*0wE}yt(2@Vbig6<%yD*jLvmZ}x z`!l)cgjA|EoI;i3^sz(MKRJO5TJe50Ia zR6A1Tls3%QW$f^P5s|*#V^@EZc>denNg>X4_uc);t`cTe+B~yh#OfuZ=?8#Te*sEk z_xs|Ng7a7NZx&Sma0O4OU{EAgKR&1#XquIb%XieWxl9h9CDo|Hd|Y@!_L?Q5@0WA_ z@z!HM{d41fMQY8xIYUBRpIbJb4o}ePr$D)rFOnNYx;o?KG^xo*nv7(otVx;ZAQuM) zlfh&$m@Ed1!-$FW6%Y17kBRU}(xm?!yRz?8UUy=pTEodx*gH5lY*;asMhPt%D1A-e z?7UE3UY?(yuTrVH6f4ylPJXROBoe*2eDa81JLHTO4HR1UmN{1iK&Xo*&{1h!j?`$l zb+EIwwSDoa$+T5Miv~)6kt9ueF*!eBuf)rVY0FfLc-jtk232b~+0{ZWmn#$s1p>jE zM@Q2rp+y6w|B@x?dg1xx+|=w!Z)cW>qt)qj0GtE{0L>^0TWG0000}`aaiYz8NDLMjyz?7GhQb!<8 zmB0@^@-)2Cph;f=f6h6{>A4~hNR{KCQ};L!-w+6N)ti!%YHHSwZjP?jj!x9_l9JR; zE{>Kr?JN)oui+F8D@~0BLXoYpbqU2gL5~z2)d`T)>JpJb_%RHOH0N*>?$D$S5nOA) zm6k>!d;9Fpnfv#H?h#yLK7SW|5N(Dg{eDQsoxAV$CVew(`)jtod^ju}5S`0gOL^6W zR*yU%FUNI_C+K{R1SRf7NLzF3Jbl0AXP!+IqA%h*MrY z7)V6Da&kR8dH50bSBb|4r-DLH)w{*;DiWUfEZ*! zu*>UM${~u%5%rxo7$pegc?A2lJ7HH4D82~ew{&z~h|tFfe3?}p;T5I=oH<57>T!v1 zCB1<3t?Nh@XEYrhR?5qr@w<0Y| zu&KS>n3MJ01T+t45=Goddg_0O9?ujfpo?^tU)~ z+>%Avo@ji(u9QjM_3&J%>FAee+5K{iqkW1V+GcsvN?k_$>1%k-_ob5Vt#M}3Mo2uo z(sJ?Bk@?g(^WGWJaUMjGjp!-g7?u||%+72oUc%9JtDo9JAXcj#8+tDz&jeYAOm=x5 zEsGti|?qYl;FIeL8?GHs1jK*xeS1GvbuUX%Yb;4q8)T+P|al+m;L8dlbuDNv% zMf@%Df(gy=ol~ZFb?NRSi5`b-(=^DT;6>6?x8K3PMynXZBgdhBSCd*xj$&2B<+MP! zflO75&|3s&@c!)@S&m1yO0J3Yo-dWGe8EQ=DwB@!(cFzADVp$E@<*4~q$2lt)8;V#BPf*b@csmUR6& zUKCFWY7`RMT?BsnitJ~%C3{9N-B-Y1z)4(fCZ%sI*2a-?*z?Zf7_C1?VVn5miG zhRvkRG|h0$kj>DnUPn(cz3TjYTVv|7`a2s1l3AQt?paieL{4$7j3o8XFVZw|d7||t z^3%%H3$KO0xWMh6B=8}GP+l=JKRvF8)SAe8>t^A+TNUo-I7*d-k2;?^7G&oW=FhBq zp2xgR5Yl$X>M}_(F&eQIi6?PkqEZ$~Pb5j3COaR;V&dFm?8lB;x{PIvegrY^(Bl;1 z7~;qn*)(%rX1yGHiJ`To)u9=kW2oU@Afv^lF`aX+H$GSEWs2IO2APIcj?jznmsT$v zHN~C>=p96$>NP1fsY*V-_N>@wx~7#H!;IvW7c-45X6|kGTRhDS#UFUKjP%d3w~5^PR-PEj-SS z!W3+6BP-V=Z!}$%%ruEJNtg_csq7Zc=#z<(!M=C1)nJ-_+P>AkHG=__frdd*`K$8x zBz5J=tSebUNWb#w;FZNgGS7+m9SE|ISAcaDDB9FQ_dzmel#=yO@8=di(;Lm2MYK z*C5w)*@ccP%{Nmtl6z#Wh^#7IL)Pv@Mkoe%uqKGICX=;(ep@@E;I`p>W76l-MoRLl zdR(p_o8C%JT$}9{!+09UZabbApem_)%c^vaj?IiM zMkjxus65m2<(A1Zk?5wV%hPGmX<@!G&M`fs_k8u`Z_7JWn;cV(!p0>7>5j~ge2%&i z*+CaiS)GZvC4TGr>Ah_qKbpGxVuB+UnURHssS-zy0TFNKAN>D(5(?{r6(w3{P=$FqA>(sf*FS1Mj=EZK@f zRiKbXfrnA_C993_FkcmSl~^mQrQZ8K-4tDUJ4JElHe2fH`p`%7!#Qz=sz)4oKB zY;SKkd8c(Yu7_n4=CI;13&vknx}(DX=!ZBC;|s!j7gsNMUc8U)-AK`BMa$OB+kIzH z(twdtWmS$*+2`T6m>M2$`WCKC=Gn^7OF0i}lrWV(Ckv($CV5cXbBYMoa)dmLdEhMZ zl14eU%<8Mv7fX+hJd3cB!xo3gayH61w07H95Ax3Hv7nbpWX)^pUmjpYE3vZBv8?+L z@lGH7u-;K%61V$3w<`se{pnR>4vH7NOee=WMxL3a7B$pc6;XsAu-M8n(Laon!MjXeJ(W_*mmgt zPUc&)$^ETw?R$M4zS$XBsC6Ed z9ah;uWp5wFClO8c=zgX}S*$jyH-{<9o-CNWm|9U!TBqooq`YSqw$6=jQDO=Xd))KQ zn?&oO@}RJyV6%}(T1}Ek)=1jBZhE~+^}T3!|JN~}ec2Hz>?hp9dfp0an(a4-7lM0Y ztya74rNpK92e9sp8jqxx`OcYjj@w{6E?42WO@5L-ikuUw5$ZHpt#Df{8JWGHQ=yYo zC}?E=)$ObBVQi0TTlJIbq=HHV+sf}gwWYq6TMJ~Ve4U@yYrR(pkNW#k1w=mAuK74_ zwQOyS6MhbGxpdIkQ9a~&>3e>SYK_tQ)g|#E$yjeZ>6aU1jYVk*C=fWVZP%fZ5awq%!i7egx1VftZ50TCfvz;@r_KxcPi zcUr<~LTsJAU*^Hr`bCn$k=Djm$~Wy^TpWh$+Ive4o}-==%NgU?sxyAnftQc0cZxSO zK4$O5lElUyp`1xv+c)E489^ZUy>4piy6Gw_37R?DvznMYnp&`W**gIdMIeO5yqrwT zY%ScVO)ac$I*8CNSJ%-}-!vDY)!|WQS9X%Lu)Znh<6@!VqoQf%V{0a0PAevgF6<=; z1K3-*nNWM#+c~%jdWq2f99Iy|k6&h^rT*E(%~pg~{P=>@y2@(Ql8!DG)V!?hEN1NN zT+|#KysRc%yzKmZoXpgm?3^5I?EGx(oGk1Df;>Ee++=ZX&d_#~1qR`18r^o&LIzgX^E@0gh~5CQfV|tn6(6t&_Rg zUwxe1UF?3|nzyxH-CLIy%~k{;|&fj-aIfM4OsJfR&y4vd&Eh zb4O3tE5dC5-tq5Q|9eaeDHAsfQCO9nEFA1C9GsdQJc3-jf;_w|?0kak>?a2KqvgMi zq3mdW)6)CDjKR$gEBoXaCtCjd7_g7bP25cWk48D!_QW{mW`dTEF7_sFqBreLtSs1^ z9IS-d{(kX9%fHr^proUnqYK=Yg(#OW+kboczxIN7Rqc;(Rn%2oR)ShyT9TJTfR~qr zla=G-Felob80Y7@6_j^ybu)1=vyhh(g%?yLGr)AWzaQ^43|9Zpj=1&XfWa8p#alC&;X#cf= z|1ybxS-j&uKka~^iP^Dj6g4~EUKZxUZ2x%m@7wyT=bznf{{Nl8KgK`N{eQlOr?rK{ z|F$vz80u%M|9KEsM@u(P6Bi3{D_9f%=a%D-vH#im-!CG}cI;8?ZvJyR{&@ADv-GcZ z`=7Had~7HMVMV~*nf#my*hByE+TU0HqrL9&%-XsCY|q2Z4hI{@@$Wyoo_zb?yXyV# zT~EIK?_K}yspW9fO_cM`tNq){Cwd)Q^FNG?22c+RQFyd}f9c;_tKIanu+x>g2|L*J zcwKUHasS!r-{1MKJ@x+X$;roivge6+{_Oe3M4ccAKj-m}SAl*2_hI{s{QPr@|Jn@y zk5B%7r2oeQpB(P@MNXpe%k$rG{Su;+4SvIQ5{+M;|Ay64cAFDetG^Iu3tiQvcYe-PNMP4^WSj&5~7n0e#3PVjbEPshU=FQoow(M zu9Il|^87bkzl7*ygWqtSMB|s|zv22NL?;{khU+96zdZj9*DoPD+2A)^C(-!j`ER&> z3DL<0zu`KG#xKu*!}UvuPB!=r*GV*fdHx%&UqW=U!Ed-uqVdb~-*EjBqLU4N!*vpk zU!MPl>z5FnZ15YdlW6?%{5M>`gy>|0-*BBoo@WJe z1#aKK&g zmbOSC)$dA2ra5jdO}xY#YI1xW1fru9FZa0uqkuQPt^IoU{Sxcvx2eMrh`ih03zu`E zJqTod+ovM7Sb06}?gTrfQlAfiZxOM}J$_@PW2(~8rYo*5nEEtg;`x-dqMqG1{HI>a zv=#7e7yPCC!!m>`?54JL=TUGG2rD94vKbcBLOq;^)W~yTPtg!TrD)hgllygjOw%^` zEw1CehL@M|L+R_W&miin=qQ#04%9v|#yM-1cumzt-oQH(s*ON6T@DxIc;az*fR}r{ z$VJ7?EStY}o7oyL!1hs7Y_b{2sMFD1#xYRu!GIh}+=1ZfQ3 zV=hQ=7f*~6=;p^og+`wmmwg33> zgBjov-FWGYa01|F%E}45{5AHZTaebY6ZcwAOUPY}QxiLVKhN|h_6Ld2?Js=E%n)O{ z``YP2H?3ai6Z?Akv)3-hO=K#qsQce3LE)ZAe6YAl7up%uS5jeUS5U6J-o2`{JZpg) zo_Z#utPvZPAA?`uOfJp*GY!}8$@+QGyd(|Dq&ECV0qrG)&8sCy6T5`F;?y9-{vjT%)yDG1U14Duz&raE~*dW6QY|UO(7)GUh?&z5E z@&4G`q7vF3bEo9fIr{km%-%RfQlaLk6wGa9CnbLrY|>|p8P=^nw)JkT)UN)^bC(pw z4oZ;tPX6Qhbw{{93*mJ!^KC7PPZ|SIM*E`!){eAv%U5YOGon@vqb!PxC2M%y^$*{C zI`<;2>5V;`#bn^h)W!L>2#xz6`QXL}P>U`oX{f#%I}`al49TUNB1a|f97+&}&@t_v zl&*?l7#<-^Ot?SA<8qy~79(liZEDbE;qy}>X%$Q!-4sdNCb5Dahls?!nfYfepWG5< zO5{*!m!3yNOumK>WXq(xMrMGSFwnD4Fvou{VQ<_`wdI5g?>??L1uY#NK3-m4KEAf;6;o4FPA)DHVc{o>gq=?W%-D%nS69(7 zFg|bkTe{Xp1$T>;5-t%s7S~jqpOCVolXxp)`xFxk%dp1lTBdr8@9psL?Ck8w$jFp= z)?OPP!!Z5A0lLr`mz@NofSiFvY)at@=V_U(9UeV{La=O|Z*+xhak+6Hb;s%I>Q=Zd z;Pp2vC-b&6H@`J6>F@8qq?*b<5VgI#ODPs$kf|;$D@zxO3{HIVL<)HY|GVg|#_uKk zY!qjeQ7qgpe*OCOk-|lZ%NH-sh7lP)>$XOwQ3!dwHRtrZDl03isMs+xL!Y98jYPif z?7SZlA&wOBS$|Pn%)!AC({5h&`t@b}yKmpVJ=ojY+T4Uoi+Zopb91i`Sv}oYTkBbH zGxA#rGb|jh_1$U;$Cj0msW5O*QBhG+djBDrFZ}lHZNC5?A0HJJtoVhx{aH5sd|ojz zF>+O9c zMH?e`D0-{By4u&t$;rgzRN%M8#n_Hn$2U7!D%oVDq!P#*6;7uDGc_3t4Qt;`I{j#1 zjQjfKL-Ofc6FJ$bpRBpJCx(XfO2W;|%u-WRku*J#o9pXxnd*LVw{D&CJD>c4lH!1- z+8AK*@qrKAYca$|-M_D*s%m9r^-4Fdp`qdMFd#3w;EU7|w`|+}$!w~r&Sw!0^^8O@ zo~)LZmN*jRSZ!ThUGuq>m6d4Nl+>ZYAt6S-OQjDV;_)U&;Z*tW@oumO1|IqEZJLnW z(AAw-+wtA{j(P5!I8ym|UOrsI?tK4#w91`nq3+V9OUt8`vG^4PmGAd9moTufT6Ji6 z@M9Abx8HMhP1vWYZ8u`DHMg~8XJ$@DZfmIj&%y`yDL{$|KK z%}5Bh_hoJlSAv@DQtr4sR;$Etfd-$5NJm{=T}^FbdD+qJxwkdb#atp`C(Q#mLLpN-CdRl-S>uq{m7VV=f zH>OZ|++4k>_6Qs#%3xHVHFs7&?HCe?tS1u{71iXBMs_c_*?hwad@}E z*!W`OrH5$Ag_irVM{{C^kGkfjMfi8^C`F$}V>XSA8OF$kW+=(a%d;L`7?CDiSr>JB z`nl8C?@FWrQD<1gn^z6S*7o*1yLUTgNh7GmalAs>riXIGX125R^IOSs$@el|vXpta z3x1yMNWhh_;}sGW9h)6Dua-*Z32hYI+F4)d(bCe|oL3JBILy(=e&PG_PqV_Ej zi;A+cZN0skQc|I2_m`gp)-``EReBQk`t|GOx+6*&&1=_8*ok@Vho5UQ!gB4k*(kFg z`N4rrCF*y$GdJrZ5U)Z-MYU()Mj5fRWKtnT(zBqXQ$CKs!4-H~4}HrytGDQrEAKY>fvN_AC_5T4a|exjkrVYHBfE znV+9Wqw+I$7aAKIQ)1A_?c?P>KFCG=_*qz@8jPPmf8N`FSQP5+;!+~CE#gs3n9oI^ z`14q@N=gy+Px2F5DUJ8nTU%T6{66ZvyS@;&`L!Vgt@jEJG7U`T)YMdSbF=$VJ8X}h z?rvOCQhjxG(`=*hSa!`lQC;S}_Qm~atQgo!E-tgRa3vn%8v$N14aPIG$H%b) zRG3{@kjJ7xM+ts-eel_am6;jr#Kl=QIy$;5S0Yrh&9sJJ-|Sfq zJn~&PySKMhcT}sA-LxZuO!FM`md)*ZNM+8_#EDMb+t9fM#-#w_8gCpqD@gDqM}m8%FUR~;-e0=w6cP`0T0+` z$ZA5xmIU(?C`nBo>9BIkttHy;xFc*IaDz4Mt`{3@aq5IQqwQ zs+=Yda7?|N->zt2XZ0+|=y7tBVp=UFmf7uS70DCh<4b++86CZciNUw>thdn@tMl$p^mf# z@|SQptQx%GBO;C?DJjX19p5#laf6XEy4<3J5F0yM$n(3gGJx!#;r`R z**G0!FxXWYkBe{9Gby=e95rwwq>gr;9?1v5HTX70%-ZftOG#0O9O2%h)#{fU=DcSHi0zyv0;6kwA%;jFR#VE4Fsxc~m+?f4Zy7*WN38 zVb9G>P4ANnm~v0pqeRI}JMp84KUkxM`Aya7m|l778mDm4qkctarqZj)&F4&%j9IZR z1_nkiPE?FT;|MmwBSHF7{lFHN0a34dXf;&C^5U9&utpPM ziii#OA|kgB?%EkIS|$UU1668^rfL(gXuD5AH=ukD6Z3P41xEV&JJbnFl1OP8nW@s3 zKgx4*a)6P|gl+qY#!IKE$uVRJ=*Tl55VqYBI~#?8`F%D-anc!jXo>mP%N;&fX|X0; zK$)DIlO_02R8$nWn;n>xoNUJVcm@SkF^lix!g@_j&FH8>&2U^{AzP~P^uof2c8%rY5GWg2mGU==FV%K749d-1=*YcSw-{W0QAr_~l&Vc;E z3||TQ-+m#mlAoE?m1aQw;Uos}+GuAKmQ-`K!WW0LyYVOMyQc}|R8$*Kw16$iG)8M4pFja9-44Gxq zg08qZpd4NZ*!q6s^(tqLZO=2IiK}M16>7C60!}mj`ji!z_p*tWR^QhFi8AjH zW0oq4GSVLUY%(29O=f0hyP=Y>CoRGp95gX}@tQNw0+obl3v5x*%aWmQ-QCyx z-mf1YZZcuNW-Oa#}z_v|vr)p%Y0DCeac-8st zm3IhrWYC7)Xaxs7y}6&CLB95QjrXgnDjx_uhK7dX%O4~rzR=Ef9DfsqgNGhQ#%p&c zBBBy#v^b6d>sIN2p(OIyQ3K*z%j0NzZkP&+it^{^4laeNiHkRY`OYUMDfbSUkgDd7 zue;!-W+}~1d{4*FJB<0IB94@_bc^S>zm+!zP?cmp$JUW+*RH|d@Drul>jv^!k;-Vu z7*j>gH_@9lmEIteOZR}+5hqVN+}G>{)d~)$``qVh&!}cwJt`V8vASo^p1pqUHk1pI zklqUEidPMge)746Z{MVleZ9T-`1pBW1STG8UAS-oocxSRi5JF1BiP`9GJVT6RB^%q z(!3DGCGd-Ug7pu_M^=mD04KeJ(`QjoYPP2$Ra1pYh>1TgxS@zo@K@iIX5@NM`l7<1 zKp_(y8@sKW>{CH#!r; zl18^R%_^1Z+uPdaMn`wSx_<99nvnkU$ZIGK!N>k_R~V8Ahcr@Wjmw!PP;6!Yg1 zj!o6s*-1%4axF)b%J0Xmy1Jv-OR6(2-un8(Kn^A!3kd;N&CJa7G7jGlxdDqqU%zTz z4Vy$mM$ED-zeF5i-u=eh-26_<6a>GYc0P1=juo4sNnGaT)xL}mG5~Gppq+<_$t0L7 zH$jS!2B36qf;S2WrWKf(32g@oZtyvdHOCqX3ky$8Ps2hn($m|SX^)MFI5*0v6y!`& zI1`H(9n4MTZzu%Z0rW!~J#cI zr}R_xxHN6($~}y41sJ`s%g~AXM87^uo5ehxRbLf=DC%T&6&F9%c~ivwE53WM*aCh+ zd_086Yv=f$bKI%5QzQ-D={9CL9TcK}N4JJhOYl<(9mPzhpUF!!dy^3U)318((CbEm z2+MQ!>{&0$-n$Ic6BhEy*wkp`EKkP5GcR0PxjMxMN-=-vvfYh>^P*t}toPQF@*P;j z#K!MN98p7Gew@Mj=IIb{-`7*L!`13Tc+a*Ho~qyBhg&if!*#>VlSUwL7KG?RzmL^o z(1CS29duoh=03GXloaO;T*s>tv~UX(d4}w%ex{YwQ%aKLHLdb@h;2$~negy*hA$Km zoqk}Z z<7Nvu-u@gqSeL>AwT{>vL|DW>evKx96JeTSAAoCFPA&r(FmxGoLzlMbzs@eNPV;Ep6la z$l6>NQ`|eFgReSDUudIOAU4Ov#RZEcvj;(<=+XXKXlUqMsxQ`<7e{{1}=5YWR&qrL!H0V+!x#Q-rOAKyS*TezKgzP66G z_FXAjpuZp-Sy@_69mK`ODP*qxm~48!qI=_p2++*g*;4n#{>c9$XHzvtlQXiHY&u{B{lvp*x^1My zLeby<0Br1Oh(FJqK|@1>X5z47%)4oml9E7%0j(0`M=-~(u4`>nfqwhjE7Ei{S*Vuo z?xkQ;FfnJH_@AHi1{?l+6N|1ZoIXpLT@l1@2hJGt8d3nr6M&tGM_37#9AWl9?NJthd1~30@=vCl$ z6BR%VX7xqP`1|+oD=PR&qgqXifuG<=fVTk%fs1Ueu1X-4Ra73Lffx6mZjIVbeDUIP zFf~MZQ3X7loWVFi)mnHL6xnLc+o>5m`arr96cPCVA!;UUD_dt08ChB2E7Ma`FN9oO zT;PhDj09j6ze=$tfQUj09u)`YL2BxEFsjdGiN7I@s@x)c3RJS`%5!ehXtM@W-z&J7 z(19xv5D>6U7t&BP)4#g52JnDf1_#IqSmgXymxv)B7a5tMojYV#)~%8!q`AU*5#p7% zF?1be(IJhX>puU=;GTR}CWA&bEjTll8c8=dENp0K=vcEN1DYNze4w8N29+-R+se4L7gTU7MB zJo43+An)mPBo8R!scm>WbN+vQY z${*r9;NV$VSrY_kh$6y-wt)dYI=bn_!aCL~R~opqz(oP7Kv^AltB;)Zc$lP z6%7>?)LPI&;l-HBans`MSXEJZ1qI;JbVyn{x{&jqA3V>@3`)0$bM@0)r^#!3IHy5UC^FDe2S-`BFN+obxewYGI{@K8Wo zZ!qVC@FJd~5wt5M2G?sA2D-Y&uZFT>reFla62W}ZI0N$;gt5Q(k<+np)|G7a*S!@Og`#wNw3QrSH>-uPAK z=5~yai?Og^Qr=PCxAwvcvPUC~v1KEeged%8`FOzf!hyY=9lgXsWFj9inNW3uv74uD zabEuyGah4>f-7L^Zr!@|EW()mblK`NNU|pLVU!^GIfTV^ZR_%iHO@yjitwx$=&`8c zpq3yJt*Fz-`AE*H>^(bd4P0|vCm*;qr_9d}E-c@e!Dw7EVGL$wJ@cr-g;1wT(UgB> zOxg?odq%_!ypR-bT=58|wZV*Lpp-dH(41+3XHINWa269%XAXRXfAk$)R@6xwhN*3gMKQJ zJss(<5-PyAA!$Hso;&SQIr`)Y`RWMlYS>dbIajEto*ug}bMuJ<2%RO6z>R=_7Y}{2 zO7;E%>-EZ&E6-P$V&s6&FyW(v5}r_%0Hn5u%v0WC=3L{O7sLWO+P=y zL^dQ*D1F`s>9pp)r1%Q-^XJVuAH&uoARvIDdm~2d?d^ecPr6jn(9nRD1nI`r)wLp3 z2`tj~HowH3rb%mVQq}}ekeFiI<@D@qY`!in`R^`de;AEih^j6dy3=w^`K`QvbF7K6 z!oBH5>alv8J6xFG%D>#X(2?HpsA9^A9}SDV!e_%qSy>rmS`QBoZEZrsv^mJDkYmjO zkA_eQe03AHnBVpf69)&@D=FRG-Llb?JjCZgJO3Hj`PtYova_pY_dvYh?d8?n+REz7 z)=TDz_B1KH5l6yE^B#35>myIvQ0~yv&)Z^X{LSqs3vP9MdsHG9UqRbZiBCY_TsaDP zz49@ij`tB2&2bWG5DZ1eS2S+Yl{ORX7VAeo#?t|f4njd0XZs#Jouk9$qc_%tpL%*= zHy7y`>gf%QjU9f?Eo8(;&r~NNAONEl&himF8?Xb&3K`JGH5fx;BUb-OQj#Dj{t(!z zsliu8{+MaMkfwHLNo{RQqSo1y%(WTs9HM|avOs5wk(v3MmDt{6UFJ7#3!i|AK(4Lm z8x|&}Kjg_|vc6;2U5J&h?RoU*5fDEUy>H*XHA~!Vuf6(~3}GNnc%!sgOG>KQwM%4c zXYQ%0ipp`;B=U2?jq0~&=G}JHFRItp)IhQTzP6H@FtWP3`s`_ObMqO6<+F$&>05X@ zw%4Zanwy#ilP=cZx~ZzFI*Jw{H3h=)W`p05wH>8ltxp{F9Y{tz@p}EO7J-;R?@z~g zRFTg34ek=mHqbCFMlD4}j3^nH*0t4D1r?R=^Yh!^UUjK!Xn=M5@#DwL%nX@hO|fP< zI9ZUcZ?|E#7r@LR5Ea49v~z6E(mX4WKZP8fkr9=I95v3j;Zi0+K~kF6z;7910r2}7 ze9VNA1`WwRGsbIdX+EdS7Ro_<-ljCE#q{ymm-MZY-l&mt)$tW2QaD=b z5kJdEoW^K_pG#XI=2)fzq3q+2!iCxmTm^%C$q1$%EapBm8w^WUDbg0EDk8p|%&@bN z(x01Qi@b`Kf@RZx(4J62D%9eY-a)Dq=Aod6g20jD)0AJ$u2CDS%DeU+z(R#L<-e3l~Vsxt}> zxd|~(5&fVis}7eJ(Qq2E;b7P12sJB zbYGvIn;fDZoW$aUA12?%9WgIo2MPh?Q1S5U<|`t^B{i99l6z`9UF4fD_6NY+^!K+; zI-#SZD<$lJAVWn;y87b>zt@jv`MdptgZzAa2?+^vK3TLCT@K$BvRk(ASmN_`4cvMc zm|Jz1Anxdx6jfCf8EWXXN+Umjj8+#wq1xsLD_TcWxP!spm9;mNyph?M{msr1qh0DW zX53L;+ue78n!_U_k$3ODxUfn}Mn-hwzTMK^7jn^4X$U=(kZY2cxkIBcWnS!;XT=@K z{ophOyEPL7YG-$b?CD!qsc|MAo*^#Q1$`g1rUuJbO^uB%uC7tqB}LC2W$4aZI`mfx zTYo%zH4&dCsn|JLZO2iW=_m$70Z2!2^YFx!40d;Oh>1N-NfBXZze?HP-R-=yYC#%B zNKP&cWQ(64*4<%;(cwb_%F%~!uIX)Bo2>IKk}QTxVUKpi)==3M!_^_XoQq@HNGL)=-K}uh{0Zj9K^mP_mPI_$il(` z1Y1zY2nh(528%O58{LnnSRJQ2{1Fb^RhsFj+nPJ$T_AWU!?IN>ahzj|HNcs_U;d4n z!BD2WxEPm)K1L31#nhCx&nEfF6V1!`=gyteJy>uPyw9K!>%zQ17H8o|=;ZWBVHRw> z-k#k?hB~Z>NI}By=QR(nhrbIs*2KiblP6Djm}s-qbN;HQurr-7f^|@R6AIgR@4uy3||3-mA@b-{|?j3hJI_VPjjK zpQqkZQdNb51;}E6wAxXzIz_r~RBzVbuNUc3x!=K7*Soj@jICJ(wR5R&aidJ(7UGgm zlvC!rKpB`3>QF`|rc(XfBeyy|MQMGA=*rKJQk_>k;Nf0I9Nc`NfpPEJG8WgH}s zd{~Y}B`-8z0@)pUm&+3kam&hd8`MR#ERB?3cNP@Kfe5#!r>A0uUgAYj(GM`gV$M^c z$$6vS1^d&Pv<|tn{Frx@7-E^NrE6Cpxc>hA`_Jr&g2Kaga}c+f37Le1l7(9z{&8uP zvpSfNk}a$|6r?PC`~E#V9~%UG5S;Js?Lhzo?6!AskeG@}Oh^bkG8q*W#Oz&sJUpdk zW$(;6Sra1L{2-cyoIK@|gcf z16CbWWtut(B5};_V@LDu5b=nH<1rC$nArF#Vlc;KY#Duy_$o~5&nkAVdQ4ibM*z# zw{v&$%Al#ZTqduppQ(i806iW7 z5mEN@=ZOpOB!U|c+ecqnsTvxlhQ%HE`TGZMRgbd>w$X`-9vU5O7)6b?ZXX|BJvQEu zyQP`TcV>n3vka-9=4R0SGa;xMK76%U$O>rS|}Xv@>W}4-SaX!$5iI9f5E= z(Xg=1@nv|pth_uVWMdUFWpv7G9Ayp+zFMB*da&Z3@puD*ndiZ3TWel5EZ56GXq}jq z0A{kaG_qA*caUFOo6M)ipX4@4+J zLbi_#ccJ>@a-70rC6C2^7Q0YR;`6X~rLRMMk7jOPx#M`N<7de1LU9y?g>UviZCU zBDplY-(}NWY}V$aPoPpiwYFo&OIAl_z&Ze7D?}AsToR68tnQPkz^{ zIhv&Hv>sJ;yI-014JT)%K^rQw?tr(CmG%;10)n_FPwaZdefJBM>({RzGm^_fLPFf!y$|CPg5Mj`D;uvCv|GqBe~Wu{W|8G|{py3J zLg33XFU{#M$~>UKeZmFuPX&l7p&#Rzbii0fw=rG5%h*YqqLNkW-MHkZ=>M69j!9-oFPADo_7#WyP7P>Up0{`{*iE zRG~WVPZ8Cz_muoo%$LDnhMG1oYN|>~uS-k)j}Ep3Q?SV5o>P345#y^_K^UJaE-nTO z=mVZKCkPCrpx`b930@UA2gDC(nm8eWp}7w?lAY>EQ*%zC<%6F+r}l!&Ojcgh$t z)ur?1PW(>>41Mh(%j72-Xly(I3E7I3uQT0 zAO)d@OoB)|Q$;N^5z1+kCqP4Eve=)G9yYZ)+o86L2I$;CukqS|HlQzEi($sAK`Iy< zQ@hWliugiR;ojcf^5<$a$8#Wc3yR#hal0V`82ki(PsN_%{Lrt_#7MMVz`CZPxd$N~iGG@<Zob}NTT@Y0KGEfE; z`7J>Za-B@YFr(0(Llk)kKhf893sj-DimJZmXBE89zxfFjL-qW@mu1_+85C!>S+t=I z7YNQKcAqRf5_v)&zsq~+PV$AfJIW8Sg)cvlMmQm)wECYABs(h7IXv{@m)|ee*c_p! z!jXN@!ea_s5XcP&NB4U{GhSH;ccs#^p9T!O(PBSNLtYVbn!p(JFYAi#dURcP)NYZ`DtXNx}ZRX9*;uU>*L6X?~u>+`lQud zp~YNIna&L=A&Vh#1KC(g473a4gcLEE3I+nfx?39?B0#nOXdPs0Mq0w(bEV0Hc8BAV z7}D{9P_ee?6a9LjDE)dGihY83&5qKI$zF*M^eav_r>N>)+ceLSaY7?k8~Ut6 z_#vUfOc#_^@Wa6nkwpBxm8=NAG>3 zrg$Fb5|8=%^$TK2!*8*d+};Hw&%`Qo+!ZIZk2WmiyP-6K52{SBBa~G_+FY6zH~E7K zlxV7|w(UWwD;XIXxPlFzS_niuJa{)tL7#_$v)IRvcc5bE@ne#-;{;OiFhmVd3AwYq zZ3kM3B6}9BpjWS4LD`4ILi{L^p5tOy;Ncn+p+S6UXh@0d-NmVP)hek_xWM_qj9xWM zH$6h8?WkD8BZu1SO4A3q&U>uplW^mnZ51&W1-}rMyq)sl@wgi%??F-q1tE}>^`a<( zB5Uxgi8-}ogoF%u5$`%WpklMeB*gh)FVqi&8 zJw3R=*vr>f%R5CZ^7 zI@%qm1HIft&ksyLB*{T|!jS+H`35RRCnl(GDt=m6&ybA0td%-Rki`Pv&{umligy_s;6QPKDxtyLayr z8ToOrvSKY?VPu?gsRUo*Si8}mo;`u5111LYrC^&N+5pQs0_D>;V}2Ii4BtCP!A7;kQfgy z80T(O6jU7)6cm*Guw)^jMSOc3em4GHIt%SUuRPlquG%Q}PZVEuG@lMw7r9)y#YHOF zJVN+2=O!BL0Z9?BoKqT5_|7{pLaDMoKmP)%q;ev}_EX-s=e&Fg#8S78aAjWa*f&66 zQ|-A77GVPHK5UK|9j}lE0Q)=vu{JP;| z!2GeRD|)mtJ(R4+=X$3tWM5Pgvv+cZY%N))W|lJF@LagW@ri=2Zp1o(#vSfciETZZ zo@!C4<_Y!p^!&;~=HYXYgd~k`(U)W#eyH%l5{&+JWbn%HZYB5Z7I2HRoOd4A^z^UKfXUGZ>zpc6`>%)NW} zWyqII59whk3ah-w^zU^ed$B5H?w99FvQn6?Ka8p-CM6Yw3=$WYWIW+jBz*h~+%z+f z&W!0G~>>qO$U_f{iNye#){c)E7P$AS@yhbx+)Geq(FPwiH-^ zJdPA(KEph#G;3M1UlR&F5wmfdUPs3o^L?kC;QsY-Aa*ukz?l+j=E#)Kyvyleb!22( zfpXkXR}ZGcgAA=sq2XuHNz>bsuQ-Q=yp5#ALE=bIP*8xW0ny(NWvHWrNkE`7BV+ni zmnhtj1?OWBRAF);9e5jxYM@9P6%7rdpWMX6#4leg*H$iIEZPfXT%drIQ-tGH&C*70 z3S0ATYt|I^_AVKRRYx7xoJcH+;g3uC&WzZ@n<}qUT-;#YgWe&wJ5P7(>a#wZbHRg9 zwaL4v#Gx^Tj>ZjZ+nYT~rb$RrLIPap_wl;GgI#xq*q!wrRX#pG4JN~DT@uL2(`;aN zpj;S9Ll_B#F1PChp#}ita0pUh9>MegL$a{AD4H@nQL<6?BmuHVt7j)wmK8<>l-pLr zDqkdK$ylK|$Fy@N5|rK~y~}YoJ+Z4T3yXr4^r>@|9Cs9{7Le`gcXdBVC2$uDg^vOv zM0OQ$fSsd2i8(qtZ4-kcl)Wn{8qkD-B^tEj&2c7;x(&{oAP(Tqv8ZySgXBeS=ID>k1f4>IeYYWZx$!oQSP;MT-RD+i*9&I`U`WNJCP!zs%)H@RE5O(}LyMMCczf3^fP9*=Cq1&%QPJ(0p`UryEIfD~p4XdWLq1^Tv$4cF|^M(+H zxtjkhEqLZ|yu z3W;WlSFraQ;gW7@4Qu!mkeW3V4eV<$gfJOmA*!;XrRjX#Ky?N*-dzs8^H1<19f;vS%z5^}bKlHXU(l^|Z_p&s&B_6n z$^Qwi<^J1efYfB-##i;LCR8X2x-6e-Z(r62J8pBG zFRNN>S-L>Mj)&_3zb05d*%(vpZ&@kqsgwew(3sFgTYi5e-`Yy>VJ7%^RH|s%!56!6 z{R1cOH~M~qAS(eYp%YpU7F6PCk+>LvDHuW73L-q!n|Aboz4P?5oW63oznb@;%rcX- zT2)q@(>(|UNae7`7TddnEwNbj!^cboMSpnKr*_1ZldB?Ma2M;k|8M z5}!VIFRxad^_Re`sCs=KP1gj*R$X!&yE2o-HSp8K#;@4fo>S@#n?7nF89o-=88V_6 z6IWova_6r|lnfhZrd~08C&Cp*1Y2S>DQKJx0t#iZgR`9H*rQ}rPkpIK1{VnPBS88a zs*?o(%i^4S`R?$|>Wt{j^LrN)!5<_1%d!&`EsJ5n!&8X=RbH@8xA>u{=01wTH1XVs zkXhn5B}EZid)ojKB^CSA5~W=CwGI)4F1Z%}_2cMnSv|L87(uKblH1qTNsxoH%_IbI zN6VUrQZ&W+3AVHQfX09QacA*6LTwL z0Kj$1^KI!7PGmI5M?U-XvU{itG1S4#MNII)2D+K+%q z=i&aQgq+0U{&Sz=3$|Gg_~zL+jK*$)?m$PU(V6`Mm%%|>YTYxTodyjy9~V+1sXhcO z_{EE=3K2rs*Rg{}BFO-m(xI2aJ;!JGiUna}sA2?rc$5Mdi^xc;fk69Ux)p(?Lqr(Y z0Sj7W8etzKX{ATcCXLX-nD2TYwF&#+)=Qz6Ok_(T6T~9jlg7i2eUOLSe@{%D;#FYW zpwa031zNI3(B8dZGBpd)VT|kMX1NE=F35$ZxmxGn^D;K`9;{Xfdf+oVf8$PJz)cIB z^IvMEQFl_8ljSwEwPw^evNbSfbhWmFtO@|Y zFXU>cZ)j=kL~3AcYHlMyzFQ9>Cp9+`AXnp%W0tcMH8wMsa(6IRc9&N%bhk9*F(MZd zMB#Vkg$S@VcG4$xwYIWx?O{R%TWfCT4CXW>yAf9$pR(UUn|hzkkRDQ6MdT2O|?+ zB{7M=JB0j8fZWW<$&Qza$;HKm(S?oC*1?pCg@=a+B7=#Ql>tJ*;OJ)Kr0>dL<4EzB zkbmTe89N#}nAzhpF*GAXCSxmOYhxQHM+hIwf913L#};JK1$g0T6{deYn z#%pc;U%Pg65_g6`@HeEly8VaKQN_*9m`Tal(e|Z-p|Q9#WGWQ@ZT3#)CchTvmZY0E z|Kr$=UCsXowwpJ9vHehmzgCDJGFM(v2V;FFV=>6DAVh;$8CaMZSlCopn0eXQc-h$* zn7MeFnfaOiMfq!$f5?!tH8MAG`!6!sS$H`(p=Cf({#yn_=Z*B8^#6~fK-2z9&X4)n zI;hy%S_%GTH^1DY_}|(?%EH6QOiH6>ZewKY;`kV9dVe!Q$uu(LHL-QD)^`##x7If` zX0o#}>nSA4frMC0KVz)h`tj5F{vS7f&FKHJU}$lFI)O&x zx9vZ0{T3o{j1WoV< zE@(7<+x`RBZy|yv_yZR-8ozD-f$O&rK@lE zuHQlgP4EXUXf%G?{sY%$ea=6a0Y-8jat!|G@QIh@c7nzy*!Q zZ`*(1`YlAz1b^UyM&q~bKXCmPB4~m?a6zN-+x8#0ehU#a!5_Gw(fDoq4_v>62%6vz zT+nFzw*9|_3+30XMPnPtRYe!boy0tQr*g=BMp8p5B{=}V9dg&yCmaB{#sC2PuK)l~ z5&&TLE#$hRH~@h2!2_|V7XWA^k`@zDah=*qaY=r#GTP;BTBRKKLfw705m{>YIdfb) zv47{>LFY%7j(Z&V!*2wfv7X%zlfjOe6LH^_*|qk4F~PfbWjJ-%-#_~zE`TBV3>ee+ zebBSXah1nqwckxXJvmw1gmb|fl@kUV6}Gv5Y?`W#9SI&G3DpEPvJ%weBSMwXg9pou z#EeH;CE?Hs12DkEE^z6-_PfG@(Q`QKRnr#4#ZMDCI~Xl}#ROc?M^ns)y3|0w5jY1S`m< z1O49sNCFoQN8Uei5o#qr8rB?!d&ij74>&DZ7GRUr_b-H46E>?k+U znPc2jmW%q82UE@jcQ7DUk0@aQD1RbizFKsg>N!(|G0YJ|B$!lXZ*hoB*lP+X8WM)c zYuZCw6Q2XJ(!?kr1RS)WVm?s!GU>j&3+apLGms`+Mu-H#?Q$lWa9X9JF=We=j5V9#j+NL;&`ik7i;#aIe@}Tk?dxHV&q^mfIBt=b;9Ha~-g-_O7;&O&I-{ z!{3r{u!U%Qg{`bmCyWxZkr4_;-feBsJJa_kd|VHn8*pTHKfLy;NzBKuzcqgoFA0-} zdaHGvAN1D-NM#tf7N(`7KQBBXDKQxRChl*AaHCx}NZs_J`{b16nX{Z^PL;K)GpE1r z`Z^6I?mg!~H1hD6oZ~)ULlm&{t7YP!^f!9KG|w()WNcD5fQd?OIh(xoB$D{edy_3Q z$+jk+zW3%#wu(lb z6>#UPUuwnrWi#dalh?qNf3F3FV@7-J-NGml7-&9f&YtLpkUtcT_Wf0q$#k8x;0ega z08N=xU$WAUV_N+$fd0aY(yzFRnEeuQxhNh{`&|yoVvzAGQ_pOD@EOg| zdGpV*-i#WQwJ*oz+Xg#l&*eGp`Jy!XI#caJ{<4Tc8&4` zrhf9e?&lnt@SCoA?+I;bWdZ37Y6u@}Suey}d5IiF=xO#aTT!=ik5R8^ph=x2sXxNVHgXiBUuKh5X*?9e!x zVP-(x^{SkL43){9vjF@)C)8~ePAN5q-1Ph-Um3QW$P^69-?qkdnX%GGHGQ_8mJT#J zeW`fp#U=@?`^=zbE1vAfTiE`hMD;32)C=zCpuqfRWj(9PC9U7m@>}5*O-!iDk=r}E z5K{GNwjN}z!%`=gKIy#w6DOQtrs)qhq7T)Ud}B*^{}2P z9+~sd@2WzoXGWl7xhu3NNf-q4o{ZLz6n{x=J$T2=PUOrDe8Sjp`OgS+aht5l#8uNB zM?pu!=FIwq2FfNT2uW0!BqTWYB@Hox-b83#n_fWw>e2}U-yZ9x?FJW;x&;Pp50O)t z_`(5@`oTXM>Ae7%OW@%c=;(+&fvSzvPsFHMk+qmc@iNl0rN({F`Whuao{H!-#y)yn z%|0%Cm!4A+1*~2}7$t5X#@&9<&Uw-^&@<%`+Y!`b0*=ya8!M2_%>9)5lUEOE`sbun zq|Vm*Q-Tn}-Yuqq-5--42W3iRdM#z2e%suCcPZY3=u@awogtE$?RrwXcGv0pZfhEw zOOeYpK9@)v)xf8G7onM#0#2U z&=f09FsR_2+Nb$ne!EDwr_Q$SLG)S{Z*y7Z5+U`c;D1-9x>uelGq2&JUWEG`;3pfPA9kwC z4q4;?!PfgqU?fsunymhaf&ab(fc)8%&sUy*g*4`@$GuD{g$PL+1qUU!M( zxBEt}DwL=A&|4nJD$>6`TaM@jzL1>N2c>ZmeV_Rb5WKj&i;Bm(p1cayKD|0W>0Etj zc@Q~YA(TzNri=6s?7a|g@P2)Zr0RsLfoiSk$kQR!Y+~)%-JM-3iNNlpM^Qis?uQ!}ymQujz^!@WJOp`H&#v zW!F;$g)S2CCA|C5Mo@T4{o)DVZs++iK?RG+;JdI*+ZsF~z8B#_LTC3`S=r!j#4NT1 zd4x+}^ z(DjcrRx>p)@U6SxJw#OSk^vudjmMKc7agS;ZOG-?_XaUIZpA%Wi*ntvfNF2GO|7r@;{4ykOJ$ zWP>DH?bG9TQiVJ1zQrDa3Q}rMPuw`3N03c=iB9LGgpt7DR;j)5lp9MC*A7ycvn20t zk67!h7D(KppTREi7`K_>JsAI}-bCnikrZS{ehfe7ddOfkUq?jZc?4sSky+~T-NtIN z42`MjRN-i2_HMk(#v88d3(lQ}T`$?hQ?#h4sFw|+-dKHcOkJDBAajyx+Ir6L9s z=z!LX=YUfd?1hr|yzuovQuU98#vjdJD3$aI!tPSu?@Y3F!-xks?@Wb6R?qsjXUUvy z+j{%^UtlZ@fSW=fs`qu5i5~;D#I5h4%11?*2(Z4OfuSK*+S~Ujift+PJ+IdWQ$lC7 zv8^?$tBj^<5w)tUIvklAf?ryWXW9Y;syP+Y;Adggl^KnEgKAR!D)f zvZL%+Dy!MohLRC}!6oK>5Bc}L z+A3zcqg`G{O4={B+c)g5YVDj=hj;LT9z@eFF3ew(pc8TjkI%beOQMr>%?mS;LIO9~1eSYTMOIPunu_5=nkPd3MH^BN zI>l(tV6y`EYDXH@WFW0&XUJhH&K)zKgneuxJ}$vY*s?C~?~UK>j@Gf>5Od6NxCbMF zuZQ{)I4n5>(eY55h2`Zry_`qwjy8vJ0E&-G?_HlRV<#}{vr5dJ*>yPBlZhqu1|#I6>&fS*U)!E>N83Lv2JNFvRoTEH>r06hxQG})0>N)u41b#P^xI*=CYValXjOQ8=z(nqOq zd@zRKDW-zZG5oiYyZ{Zy)x}(DFe-rC`I39ANGFs`G?0{vYHEcKEmZJwPt?fBXyJHV zS7e&gS{N|re(?gx<;mM!6*un*h9l(jx}PZs#M!p0RY;NTpf>DU;KC5_(d4iM=vhrP zAS+YL3%5z2!2pH?!Thu;AARb*Jo)mnvh?=e`%YAPa49L}-Os(|!w^yIb3S6 z1O13~&wIC3&Kph;Z)kMwX0uBmX1e=Cy-ZzA9`7Z3TxI*^ib7x;YyWHC${t*is+h3vc zO$Y9qJIxcNhB(cyDlNy-2lvul_k1t*&Tw=WsxgEDXFX2zhUOaeU{7|YF#r=a_7t?L zAAPC{r)vs!1l(&zXYpRe=8uz7(T*+Rruil84G*ROu*M2BLLrE?!hdRT!)7l-gDh8D z1#e8TPB}vUcmWL3$0!xN*?Q*=e~h^x;@NsSs%&2@HSL8|@bmm}09Cr$cj6tlx&mcM zNKk0F@@*90a}9TH*q@VTFkUqKQ5QtKI*<~fJ=oCr)9jCZK2zhK4O z+3}3%feIXHtZn&8#5|rYS|6>{d@dQKAz%18YuG5RWSf`u6p%?K6N@&DBJHK&JKv)t zr$-Z&G$}dduTHs{aW_ndYBD7xu`>)aUJShe0tuU&6WL7th8(OkHXc8Y{ha-hZoBP6 zUmU{evq1e0(kX@TO3P8<0Zj_UA|OxlKzI9lGPSQNQ;%otW?!yP=JTNw@xSs0uNmjS zJs3LV$Od4!cdx-<9|5(!z2oZ}A|YNgJs}{g zGrh@BYS^?52(5f=&{to~P#D~VKaa(~B#QuX?v;lmI5?ZB-ahu6SEw1?c82`O!rPja ziWjDpii}N!6DNXQ)Q@Ns*4|ha)uIsbRxIwgbzxAd%6 z)u&k-y32>UM}J!q4aAZvg2Eifg-o0ci87_bsEk0HO1Wkv!6`_B+hR(pRC=WE^a#TJ zCQi^NKOnKgMJ>cF?r-Tn@n#PX4sKWLLt}vhud76_zqFkjP-Oi zVkvoMl7Ivx4j}98p#IuJeGPA**U=k$dUnjUn6!`msqSSy`LMTApT18Fb&b>-$jsaO z=HrS<4ia;31U_3h#<0?`O*N$U`-0{1I8Qs+@DYIG^XDrVx9g$zPg6uwGi;W^*E(}Z z!P%R|qE1$*#BP@u6Adr#K4j2&jYLeI4&5xdL4fOrL5&vo81? zmiEyjz4f*3Q*h!7Q7_M4zry;@)3Mo1cXQKI2wDv1V%B%-cz695m1 z67S*R;Y~DpU^Jb7v&3ZU9z3mC&C72Ac!7h23=SdNN`otMXE@PXLNUOHz_y0?8Ovwa z)ycI|n=5yE?FJ-J%??$=`M1qrgqt4W-xwohnWGd^aLHfxtUE)+Um+h{SN3MHKslHi6VA`T1oqWT3Y*<@zqi<8~9 z-skzvfNvwYFS5>ed$IT6#dyI#vJ01oi+xl{^E&izu2~A&brJNqOYKDB>y+HJ-1_(V z7%7NTqA#sLqeN(SBy}6}CSw85I!eyIXAsmW`#UZraV9m&zTXk3TLKj~`CTER>rL#@ zu^gQ6eJ=5W1M;pKKBA_sr;bK#opqTF@!0VIjKA=vU}Y`eJLqH5*!R}Ie5<_Hv%Bwc zvK6AHd(P#&I~hh-T!-K?>q!Dpv!M9vD}}fE?~VIbU6)-z9T^>=pX;mZ`?R|y&Zg!apK_eDC zvG%>!(tiBK_jJ(YVw$EQbmB=$vzzsA>@Z)~tg*%a_T@fUZnB!iCRjp|9M;I>& z350MWfk249w=%!En+?V}{E^!RIo+f|fTNju=kalI2qxGF;=T~2z_lW0oA)9F@k(G#ckou4O zJR}R`ox5iojkfl|JMObt>}u&f{gIb82gaQB(zG&HEyCVUQe?1NU#2w9wGOdF@huo? z`f8ja3oUR9tHvD(TfEXu$F9pvWt7G`kj@nnlfkr4iYvsz!CpGt*X6(N;Qdi?xcPVs zfPB2I<$DhT;CuVKjoyY#Oq}|8u#4X3I8v@Q%PKA>yO<_f1zSD(nTosH3CWX4^*R-u zyYMm$ShpJZ0HUudEh>b7LozKcv#_)7UZG$70%4K)+%L?3W;=CNfRjd{S)2i1gtXGo zKu;W`q}@~zkv~g~m*Y)Qh8!!=k{QGOOvQOUgQVgL&5j}xQh3A8OO_MUTD}8HG9qQp zKJtILY&^C<(5fXfK>n48``SlEFsKDaf~SHdFd_(hT^z+x{b3$`bX!4b8vof`P@iDD zX-&pI$ty_aZs{g-w~;p7IHZ?@$f5i`q_VDFccIZ@CRy@}cfws2&u<2=7(Vl=UPo)UzOp*+gV(JCMgPaUWU_>HNZ3YR<1Y++@feo^U^tx>EMYA@J=KyYFNq z;coL;6PJ$i&ZRX>3TJ@ok|o$N`d50D)hl>D5)K@(m14A_g>@CDT~ZyO>u?${Dx~_2 z2S4>#`n+5QJ~RfdN%lm1`TW4HI>s@uwujDEuWJ6xUmZifB+!n*_I?v+I7kTWB zO^2wUDf)7Nb&OUjuk6ACfc0~f5IxgvJw?qC6VU1#zQ4*z2|jR^dWf@uxKP9L_^S|g zTWdPd^7Uc~c)rPieAJK5tzzJHRFH&`>d0X-;Z_A;p3&N1A(qSORvI#R=u zH$Loi5BBnzBhvg-!W-FbTrm--U=}kSxz*sYLer)^Lfz754C6D%ADjYFu@rA*xC3|5 zMF7SoCag)q+CZ!3zz-#AZ!+?UzP)+Cn*9@g$VMI-pB5KqW2{gDR~;2 zt^G79s~$}vSG!1(3P$Hh(7?QMUVOF+ntpXw%`IZWG})XCt~R|BB7_y=X!m0OG4tTi z5kUZYuwDub3by>MxdkZzf*YdvuB#^637OTU=UcdLvV3&OQLUbN-T4glwEEkNi}42+|;<{ltcKDSspxeMxj~u@FC)Sba(S zkGRVP(Lu5J2C4$-zA*n(>3-CnU{Cu=>&q)!;7iPD%>v`*3sqhkrHS`lk8#MnBvJCr zL-oW;1*$?eA1JP;g!7s)oGtJB`{_-FD?&ZA5G5ilU{^}bb$iw>d?Q|byhV&6B)~w_ ze^ZaKVXQVxnks(5`=j#4$DkDu*@SI*#=T{-UoxaXdrMJTOsh_e$szf61U9%*d;9QG zJd4Csg*E&Wtx6F#H4bN};RNWyo|=C7Vuc;8$L+=z(-m2}F-}#t9;e)F+tBp$oY`Xs6k)_;{Tdl0!bt#(UcViZ(6Bv4+! zQ_re?c)yX$$K=oFDo(+pC>bm*7>ZDY;_3R^(oR?wKKiqp> zK>lRsEpy-jdhoY-3+q_E6Xp`V3U0Mh{sKNeQ+|;dN5QLbYgSRG?WoLcpFl;g6dk%f zN@)E&b`-8|s%m2dMv{ywk8iDCD>Y^UlGR&lcG@PHv6(oLu8$Vp_a1Yar&9JwSI1GH z++OWg)9F+837u4g|KpOHol-trBXX>Mw-DjRpsbny#ca}v`c71XP+ym+!Yzvs+ml9q zlhxlZYhqF#Mrs};TxHz*p1=O{^7krDuBZyItIX#U=@+Wgn$9&EFbEM$o}-g~ih z)NlYD_YKOd>})@)zVB0(-r;?Wo4B~?syFP~M_tMdw0Hn?F;w~Irpf7eV^`{DHHb{1Zj+T;A*Xb-2l4$>DF9a^+ z=<+{E6O-_6FW z8S5@PJg=eDp%9#;%8Cjpf?`>QD}o=YuTiO@r^aa8rX`JR2X5;|d>;jn&th4=^U=rs z_#%hVz`#H;N1kZ;9Th-teoo+{RxxKrreSj}6|JhQn3Jrm56GcI=4fXWu_rb<5|bnd zk_9uEe7(Z$zDyHNDEO+yAF+)YwZeM(;q&}#y~9zbGc1XemKH?~mBd#r ziIakk?J%QPcjljH>?Vwz-&fKUl$5AQk==IGaqnBynM{34PdvW1;i)DX&F05dM2RSV zRLSZi6MOG-j;(IP(ZN%*FC{Dw88n0Ick1o}N?eAB2`9V(5rXGPWvr~9v!s;ky_Cf3N8Uor~~qf z-QubJ$VZLCjGliD@jx}o(jQ+86?^Vxb4~>*M?_?O{d}RRe({~6a6ElS-k3y)iwkFC zV}sj$o%w`hB7)6yXmRgzCS!@mP^#C@Niz5G))za zAfEkPt*h(OUsJ=4N+L)YO{JhD=Kv6vm1TEuD4X>xcPPUodf-1Xp>AYsY;=DKV>50eA0-Wqj zhPoeblJ%aPkLD|5uzY^T?S4d4Wjh-lSE%{kVTBf8rJ(0*vUB*Zq>n=V#C0#7~>3cy(`}X@=#mpB&C1J)0Kx_EPwNayRv)Q`U ze5&~3iAVWhUd~$6P{)ZLc*Sa+7X><%_&G|-FaQEh8vxwLcS;WkIIWwj=jBVCxqRIm z*V3QotLgzP$BSCRNxb0!6&ADjcUKvNomC(9YhydE_DkfCF+|2Bzxg(5sW+GGrU!tO zEm|O-VxKGQl`G8VV5h5W+vYqyU;yQ&gTmz|16bGuj?Y$@cK-ep{4wlZ#)#?8tmiqO z;TIPT51E~xb6JSUZot~O!;o2DIBlu-CkPU8SdNKJC9=<)ZSs9?^7P0`mFmbZZhT!) z!OqNflPIa*Z6ZKMMs{5|TYFZmBk+ch=bm1tmMzF1l4~NPqC()X9BJMqcDujQO9`>_ z0oTJYE=(Mpi0B;o#j42aOtsxqfRFib_5#FzL6W9oCFY9@K_n7a=f^1Y;Onc4XLLde zhA_*w$9)qXGPJSfb~G*>IG0KAs#AJM&JTGoZA~1+&7QMUQzJqwOG;L@LOZt?2U53( zbQqMdjvEhh+10U{Y`6o5i00G8O9JDc2CRf z!B>Qew`}d@u^85Ly@jY5VE zcSzi;IA-Xq@0L5!odR+;bXfa$`=sCZ$r9d|RJAyU|0ir!?wYN8BHq3`*T@ISdxnOQ zTn~1vivEf;KvJhh?mP2Np?Wk1@lRikO^A?VHi-(kqzZ?dWG7wgH zId*2hx`WDlmRLwkLlVP@%}J0#SEfcMj_|zh;zNsf^h1hRw(TLOraC6JHqtVJ?{@E( zv9Q~a`g|PD0*_ta6BEI0jrn~!OHsVr_DOs7*PgfutU8G}d8d8h@G@9?spCq^F?98L zS}<&(ZAJVtkKl{5UX--MHB)8uWP}CU`Hg|holU%mll`e31CE-}v+#65+mekjlz{oY zNARbCN}keCqOmm?;0q;~eMGXtJ7I!oo-w~?{fdBQpTWBEw9@^GRMk4Z+2=#zPz=|6 zVbe}K3JpSXd3icQ>AlAs2}e0F=z9W=Q9UO*tlFZ=`PZq4x=@n&=IysI{E_vBRX(9s z5`}AyMlRfqd_vgs#o`KHs4}jc+aju4*nR zhvVxJ!+;Hh{3t{6s1%|>9s8kfV50ZW2(S1+;DQ2QRwhU6Ks#;__kNuPvHDZff#?9t z@A!96jb=wRIZtT-^BS)>@3Td}@XlE1ME9AH%cX9vrkAVo{!}s`PD$%qC?MPQk)OJ$ z|JPD}Ke2rozU0XJY%5X^Q$B%1y|vl^(eYi zxf5YBJrLxHWqn|q&gWTxkQHS)U;g504-Y>2!o?DHg}CLxqk#w}D8EA_72jetuar9&}a`@az7eWVk)Ly!DLDRw?;)mQ0AHUia0$T*K zO#>ay+))iaRevnuS+Ax?f?nv0Z47^!8k-%Wk095IYLbm{@ju?3w_w(Pv zf5@~X1u3)05&Hs|EGR@}>BcES$IV{HnB`4=anfjX>KsWBU#vF&C}7A2TLjy}ULpq} zQ>R*b3lQ_IhP5WlzNJJeVwCuiYjFtvR2upTgMz z8eMw8R<9)LK(}FhzN&=MnT&uqgHIGtN80%;OHIE&8d_xA76u%A0-;iVhiO-!#}nxv zA1GX2QS7@3=NzN0#xX=q$b&()Q;n&OQqPr-@3H|q-}8DdJ3isFN2DcTe$iBZWVJ5M ze70u{6^}k8FSbpwdHr_YAwaW7(pGY*8v1Y`!xga1l2&3hdX-@0OlHUocZWKA8ZOYf zY2LMhvrQhzg7hwQawEu^_8{mGTIwKm)fR>*xbEJQ9wllRTX zS)12@r&*7R;i(liU)v!V3IpZz$e^yACun}^XfvDMos zlTFt;_G;r#EO}FDVz1@!&!l4PJb~hASCijs#1po;vGU zz&Gkor01U$H@WbbARV_Uv-5&A^OK%9#q{Rk(|;@F|R%H_j5g&69z7i|%- zIS60y!=oc?N6pw{sZn7kiNz@P=%2uttA~2`-&*YFO*fe`83jxdg+lCgf^a8Os*0AY z9XSvB6I9}>J>ZE`;u^s_kfIQ{0C$g8cc7?B`<0Feag8DT*=xUv(zkB6!28yH080@j zZ1_(2f&F0lUJWhs8Ja##D^HQi!SsM}*pS-+T0NwaMZTwT$p2(xb8ksdxq1SW2Ub|0az)O@c$6?xy~Nza7-RsFjSkyPmdr*sk5JcY@xNq4?FO4Z%<)vs$3rzV&h zOffN)kp{=LQj?^4V!+vOTN6Wj`=NK4eXR0@yq}hh)|B2Oa=LA%MBX92s=u!NqP*Zj+-CK-qbxA{=IC?Obr6?Hrjp)c!C8_Burbc`b zb{|>=nZ^+yyT9+8N9T~qvId5frGL<#+~MmoEuAS_v{)Fyl|EDFxYR})2K2N_2cG4F zFdythZHmu!VN%7xTsTqx@(OL9fMrwE1{MP!l_oILwvvB>8Z zy&;H{;1k7IOy|4CbCk#M?)+8RIY3Df+Q%aTz37W6-fVh}Xs6z17vPzBE~EeDP8lan z!%Aw@6P=SY)VC?GGsJRuJ2PaQ&SfEM(MVj@{B6A@2eEp-V!=fB!7J!ti2!7~%uw0M zR`rVH)zk1ml$lpO3kXb4-Vi@YTwrq)1X===@j^r33gOVgY>XA71@f0Yrr!HJ+i2)| zjiaPn5#A21!bNvl?Vg_E>PXmpD%pqQ?mv`Hrz-xoBv#T^s^e2ezaO%meD&x?RbMop*6!cs4Nj8lKBGN z|KLcv_MiNv&sSD{#CVN9)U?ADHe4}_4=+0=C^+u&CJzB*Px4q3oi#%TA~UfEzfp#?^}L!!(rf0}kRrm-UR_)W9X4oRv%Fl2jSVyGFM+8ak zal(B@zVBN+YH2X`4*gwGk)1D;)kA{g;wxr7OtQC{g zpTNPznFuP+0jtmJu<3+Ti$6_HDh`N|e?Y+Aj3)S6|01Wc9Z&UXxU%o94fibE&>L44 zkd*DG>gaf!7rs?)HaTA>vF{T3P1zU}uv8wE2*K}Qfh`%;@&j}ArX0JKWGNd-;JpM3 zo&dRy$O0w}E%BHUBfOj*?s8L_)d6Uwp`9-m$|&UZejU`C+p|>YPyS>>N?=v~(1@(P zQ33`okzLJl@@pmlI6T***e}bJ{kdcbx%(TM+#FU^#zQNdCH-k8^C#OB*4z5L5-U8n zl&CrgyV;~<=%Za2YWyI6h^RnT6FS9m^xI?Mr?#~*v6UxJAz$0x^@F^!l$PSsD*C1{ zi9n;OzJrfICcY`J+z-9Ww?-;>;g2Mt&V@A_N4dS-P%tYc?w=4N{4_AC5qoYRi~g`D zHzwEh?(Bx4Sr1*f=a4f4<(e7ytKA5NPY(-wqSiaZZEwTar^nJZDb>zF{piv1s*xGdrik2d3#=~jDK7S z9vuEML|vb4U?gbXB$85m^d@k@%b-p`Z({W#Owy8Vs~yMxeQiRD*F-kCH#fA@O`t*F zHSoSDtHd{~oY)piTQWAm!;oTrXj2t=8ASJGJ%S&7_Tp6IF2Lt!sfb@>k0_+>Hj{H>Tn zdY&qiq?LzS-kF%&!6e6}x|;=Q;R5&BscM*nvRfp|77YhD;UW-I~(R?j9cwy@n}17~Qhy6JLL@ z?8_(dwwNZE=x!p{t?`A^GckWbV$Via!CK?L8<8LNb{;d3Jb6im5;UtlcA88*Uvk%y zjRrQ2V~8TghVhyjMsyQqxgEcxxTW^NV`*nUxoc?rhU&CJwpPsh&L7RHhUrB*G{^Te z1)CT{komQz{!_Kdl6cFd9OV<6-f(0Asqfy1jU(0;#wr;dJUBo9tb-kI@^yIyql z9G(W?3+O4<3B{PFS&KI$`*FA1bbNE|953;B#dcGHpBaZ7nd@RIsz(Pfzx<}spU8&8!=q7C0J$;+TpD;!L(!aeJ_~s)fC%}o zBx|@GGh}2Q%sBKhn0?7Y2IyU#qn#SeaA&2;h(~wI zu{bOjzg2m>LAX3b!PwFxTeiYAvW%^?h?_V|Z&4=Thmbq_F-6>pPW7|hCKJBR3i^8DAQ zBtOb5!F0v&fCBYWSjV-&jx@+g9DeXPPKh@pPyUXdr&+hj;Lhq`YN*ileuV3F@sJ_- z+B4yD`w_EGysp=s?di%cZyis(aUBna>%%lKDH{bgb$D9yrfoxbWOZ13AJ`4=_}d61 zE!yY_vrNrLqA3S-iHp&2!(@h`e4(QTJLI_jT#Nk}+4vYH>-}XE%ijk>AfK6_)3XBH z=s*N&T|cffi__C<)Ul*2JGDH^RVCLx0m^`605e;78n>_J%WtH7e0Lwv#z_K!4aV$@ zy1sLb9u$vx@E})In2owI>2;gvn{_Jl(NuDJV&V(0u_#K+hb4?mjPIvk#^FS=pY?D&9A(=% zN?d*GJNnsQ0mBAl-Zs!g3puU^wH)!Jf*Ly#qTniyOOeiKUeunQ&!0hN)Seltx znHd`XT0-8Yh|e|=50BgHvW6Pu(Nyrkh`be&1TWm7W1guI?cx@~OM5-ssd0>|nK-oU zhLci2SzM4ko182t$2A|T97%BrkrjE6u)jg7<%gUPr9*>2IO3* zi8FAGQVyPg1W}!@saR*m9E!xH315}Hi+maxHqx9OpY0@RqM&E3jeyT-^qi~ zV?H1XSYJ0YGBtX_5mD~I3c0K``inBtOvSo7XLv=Cpm#8&gsh^V-;MnXpT&%6R6 zLan?5CcTYX3jx;57n-WkT->mnxn(~1d%=MTpYD-8Qp>&fRjo+rP7nsM^H~rE$&*;x=ZZW$cwGvF{^qN7 zmu-^aH)W-dka|)$p}=CV_xX{zQSyM8(uXX^w`qs5Y1`B|e($iXg<#&sVx)|pnF6Sy z%SNm}RIWp|g<9duC}t?*hTrdDRYd(@RUruP*sMqCi8x%l)MYA=q}v zKRF)KCr1<%Se2L?>?HG;&6YigijIEPXn_VP9^(KE`{Ee59hQ;sxy;|JGHB{SE<#Pz z+hPRcl|!!Rm9Gw9Vq+_}9}sAwxq!^O^r}Bq^9?Lpf+e#r-ZgakGR6aeO#1-`%ki(E zl3|p=wjQ{djqSK;nIpLb-CI{^9L`a#vqg#x+RG%$Tso64gT5`j+?~TF;Ie9Mi?~F8 zK&K++q;h|!9_+>JQ}m)<|2S{-6f}QH0x4rCHfo~1!DWF()mv;2`KVS+d{Y@Niq{Q? z)RY#vKxb%>TFSFViI=D#2YA5OaK7DU0^5d=9_8$>D&M3p&&NR$wXYm#;uX=k=7DUf zZmT>hGP19FsJt$`L1?io8JF6aXOoT(>dm(TO}L|8s7Ft}TDY{Pu6boFQ`QMd*ZCh*{epg+f;2kBxp5PhYW{^?r^4&IN9AZAW`eE!Xb!lcRpgS zQlJQ9gnM3^^k&#RCo(~OKY3-o+MC2;JdfzvHQ0a!-SHhAh&W=MAMb6{_pMNC6$9)m zpu=4+0vkvB36UaA9E+7pzRR7Dq3LFt8Bo3#he?QGyJGaoTht$)vj%>w75DFsVTe7Q zKB+E3Hd_1W>-gL$yIEAxZ8cR-fS2AQ0DPNNU19JbO`UEWTj$5nizk zMKC?Phqw#*;nT5SsqxFjRgV+Nisx$)F>n;NwKJ6rPo7GCV{yqF9??|}KC(p=V#N0v z-w}8nTYTzyxSVt%A826W{&YByNI_WD*6bi$aVWz1GBVJbG0!vW@7jmgM#`_Eif#qa zZ(Q(`UfQz-d_2Y!j(b7e>@S8?0jt~Xnu6%{8LW08H|39Uji6kkLYffTejDvf`6~Ws z-ub@pDqV|Q*4vrSp=(k(XV>S>orm4zbo-ZACxOch|M?kQs;7GYL-@ z`4yc$eo(X*S#=|y=fTSVco_-IR4CaTFQ9sn`jhFx$im*;@u-^=H|hpOKO5CC_);BmbJ~)eauYWG`^&t~nwYK@Bzas?s`EYgm0lC^ zIgdX6*5&r~$Fu6ynM3;=_H|1H!bZeQkSU+D5Tcg1o2-Ro9~t7WEwUxqUw^4`_1W9~ z+5d`y|Ehn;+ZfV~*aVc_8ZiCef?&9tbsq9^EuYTF$qh%cZ%IRGcQ&}p|0i(vmhuIC zlrG6hV=D`XNPhjU(kliHsRJ&|X!7y$9oDAu(5VW~5m#paog1r`@dkuU{~wk=3bh1l zIv;UDvNN;r)j#xcb@0FrIm6!mJ8|zFk2VGEx3V^6C$vuk#r~fbK(xN(eovfhUX-Bx zKb1fdUhRC%ZfETM_cn{c#!94#&>KpZSp#b>S?Oy@dy~+7tCQ7C+|+13>ABbN|JOkN z-_}4b2mQ)Z)BMDrU)OSKR%z88rFXNx)GQX?m3t@P@vCGi8x)`6+MIjUr(9_JVMu{W8U#g`|xpo z86zr?}BjT!G&E+CKN0Z~c=`1FKJAAFYI#mh30v znO97NGGl#Q8}gEhz9tdNu?u)+M!6b$_E9;Xj37m(u7-bob3woOm;M5+YP20A;vO%( zd4GiBJBu3%%TB3F2suSQO7R%X5#u&%%0W?Wv6i~FNU=ZVi=kC4N)O)gjG!gXNO%lVK$7kYb5_;|u)rT?VJO%%=+!AWOSmlN%$y`bl6{&SQ}?wT@5py$;9-aSdH27*m>%(cv^e3M zZ}Lrn?uQpXvgdtNs|Z(0Or{y@E1~x6p#1vvjggF}=1B_I_+bl+Iy>yU=!L&Sa261P z!*};7iLs3xynnVL^~BZPXU@Xj?}+g*g0;~7fdQ?ApFJjC^;f1Ws9^oB!5IH{4W{FD zIQ#D!41@|9`T@$n$UFJxjRSkbXN7ap1U3Q+e>G8iT3q zf_z7%#X=5o!-zO$3{>L*g>=N|wN@8t8y>Z*i79m3oEdy;=k*D1%s8rXDE?KIx%#^* z^8r_tc_}m}D|<(uUh?E{_R}2y)Ml>FE+G%re+~vmrTu50U?MQQ_=o{2Ynko_qht^% zV#F(du?5oBT&`Rr?*wEt2XlrO;ya%{p|hs9wstP*x~^F?CmNH2>|S@e$Ym_*H6VN) z&bLp=3TIzhQC7$P)A!4(RHqXgNvFnAZTtvsx^U@r{7Q_Bit%t;ut}hKEuMw`Jo&)= zgW>lotd}MaQlg*bD5&HgpCkrb6kbZQd!OjEK&gO9TcpfDfqG-wf6#m2!T9broFMv~ zY)1_<$;4N8zB?>xEJ8(V865XbxS~F-8Jr?N@ri$zW90$;2y`?pC;^(Al*@aKPjEkqQ_OMxcG?G`SJ5QKa_ z{RP}$O_}a45m+lHxl|}`i+G}YF+nk zC6i}n@0T`_j};OiWgp-3!1=uV?8~FX__A*v-*UN(OfZ$5kReoB4EFlZ-*d{i;}sgU zQ-;MSx^+=Aces!o{{m-IgrGYABVr?8>4jJwHEWalpWRlSNjtg_H#7Y9gIHv!g}7%S zK};Xn)!pfWF5~&jxvXv34^WL=5J6PhC#>ebUj4Ce20dzWeoTKVcRH1mAY8q-$puvY$|dyQ2{zxlB-J~@@XcI1nH)Q{v)j^|iU4Bfz zo|Q3St3;3!(WQ#RxVON^Kf|OgQ6{5uuKh7Tn976cGu~@qMRqh*+{zP^Z}qFALkRde z-hU!u^Qq*6L(c;kB`&2pD*8f3~?kr`?K&f}&bym6B%FECni;oi-;YItD6yOfB z4g6u{Kk=Q zw4cayrLSBjj&X_e8OEPQo%qMXvrgo>;eYOk|B3*f@Ybq=TL*9dpt?i&2dj>N@BJjw zzk7c!{qFt2`*-h8aSTS42NHRX==9eO;Y(;&{5eWhOxglvEXt(n@Q-D?wU~Ph`Ku3z z9ZAwV8M!a!n7fj+fxpBD&GsOpb4T!&d3Gk*SH36KyUhS?HIl>}Kvm`bgA|`& zslG1mCPMq$LuqU?hWhqs^|IVyw&&IRmj_iiHDZop`446({ZT7Tyavd}|N7urfiYD- zjnT?rFDX?RW6ZTV-EK_NW%=ri7h}J{F=11MXYJ`74$mLbR)2xx)PMB`K?L_HQ=q0x z|GL+&|85b=`L7nCFSr(=9gaUOLcV{s2$>dY3H%R?-1av{?o-1Y0FD_XFYABq2DWi` ztF!%1;E>XlKf?^adxfI@-77TAEco%CUZJS}>J@sq`j{QL`}^JC=*FdB{+U37EPC#r z{#YwF+czvw=R&S-S)+b%tYJ@4*##P1*OD_q0o_%lq22SRr@0tpErF;B-R$h~rKsna zR&B&`ESQbpp%cG2x=2MH^BRNffMRgQ|ieDL(R3%5*e2SOJA}_S5qkqBgF2+#Ig)EF?{S{=lk2&w?kk2>p*m{oy~NCN>V{Y zrsDrzNvi)-Ns9PgNt&MNy(lyvNl`~1PxH{8%5~MI4%OHR(MA!nU^D&&OIQ(=Senh} zG<^7pPjjo!-W$Kzt2uq`SNT9EH;&~;GS{$Yngnu_Mk-H2C~D;OXHU=Ei7(j_rey8E zW~tv>UAy|I$p8g0Mm2UooN=%IH%8+?IFnlwWv~TCW{z|m5dUF7yXhg~`KPPs$v<61 zJU@(_jUUqd(^d5D?ExVdRAY}f>|d^*GNSNTf$;h87w2`F@Aow>_&^gWR;xm zflEAnS!%;0&o4C*k0_o8vKD4`W%ka^nE4hh3xWMv->`!y#G#|!)egA&zOP0WQo4Js zopli1K*iVKYWuAz@+&lvGM0m^gsdHF*_I_-#wMmYFNQ` z8FZ)&(oKU>o(PHl`_k~zL29uynDgv(KkjZHyPeW=8az+%xnuv#Xidgt-;%KK&=-AI z$I#?J!p=CT)IKFX4kAe%K>7Qi50|X|eE;?TJN&M)I{m=-=&?hE-^tfqNxhP_P{l9m zQZF0`Fkxnc<*@6DibhP{b4$E582=dT)G{n|4FwBD?VtS(njj!@3ATJQPHT$3RBPUm z%Mdj}Kr)vk{VfK)hG!7~nsE}6GZYIALz=Aejfg5eS!U(#j6UKwVrk_{>+xUw3xyFO z3GZRGpRB-{_G1cH$@{2}FjQj#Q-XK5C1(l%t@wmCnJDaMl57$KHj7cu* z2%mI+CjC#bMM5?`=Go0CAL6!z!)_~G7|YW=pS93$(I@`kz#xHRq#Qs&x(@*U?fT7f zf*ZD;JJHpVa+C<)bZ15fgfrHgrl?&NdaJ|8=0hKGbpE47u$tUTx85b;SUTH24|&(@ zn?hwX3oq{k)H2vq;T!aZ{|Y(-xe-sT?ses};HAavX5N04sm(_;cx#)PED4g}xg3r}BrOlYHH7;}c; zy$tXeuK~vY19oZ!{-zh&uo(B7feWB)tl4hI;kNYeUVAlIQ2D!?MXIt!Uw@su7&mvn zqFdMUM7Rwf1O)A{dZ zk8$z6N0$2NGXEta-Jfo|#L5kQk2q+rA7lRuxn+zoFKbVS#BqRAg)@yfh*ydzB|IVtM8}uRNu4#Fi zd7pYm(%<%`9cOQf`~Jrc&+pZqseRY6Qr(LZ6?$9aA}YsDpWSBkBISl(#VET8Q_Qjr zH?8N5clHzF)FBCLE#IkKCC=&B26u?dXb$;I8~6phD#-E*`<=7C&jupv9lFN@yP=xi zQjtjBf&&O2a_Ki+7s$!LsXWWff*R_Q5MbpU*|`VV_G|++svVuON>XGcSkP88OOcWg9_%`yRO89yMOlh|kmSw4s!% zFS70$##nV|2C=anKB8wr+C}v5L~TE2=kn}LQe*aH^X7h&{v-TaNjgb;D3c(|UF{s` zhkHE!E}R1=D_mIQeyFjxwe*L^ZfOYMs^HnDG{!caIFoo<`8h?yE?7y2LEfMZeJ`Z$ z8!jX&O=Us6yQngw0$oN<)E5J7&IcxSUWL;SS9~w{?fbiM4p)wxqxMo6yT{f0qNECM zrz_jLeqEUkpDq)w#W&QS1>K5W#I_Y@(L0tKZzG5&MIG!k?czB_8Ic{ru200r8?|pL z=Ueo*qtZmNAR16Yj;q|ie~h%cHzmaj7%@PM5SNIdmlaz!wQ5H-EuYn-Z=*`>e-4MT zzu5OMoe!{5UuJ>cn(rqO;>q8@MJA|wZGS~2xt_4o&wm9a3Qu$7tkZ4P*u4*Ucl^EQtAg})4k;=EfBNc(>!tA@Dxs)bL zT0);fy+U_0KI4WN_zbf*iVVTrQi0Od$;)$~pDp#11v5;~@0rw^4%NXT42D|igOmL} zXc*iT@gIc_z<;Jg9nm-zV#tRRR|~V4CW9CU20JBK^$>D2n{`p5rkdN@GgQ=ON*rms zpxGhCUvM+fqc8T1e zEM>6W*=$?vYuC0nRoycg-f6zJs8^!+O5Qx5G#Uo1YiI}*U<4Fu;T8<*(@|)(o05wO z#l+r3i-&IRPM-6hrg^%fk?v{Tq4opSdwd^7&~)Rj`}P71hKb$UfPcC8HZy)O~E3vPYE_`ZB;4%EUlQN z9r029g-SZ|-na+KrHb=G`Rib^icM>3@oh(C>RA?hT)UrkT=i$xd%xo@gXu<NC3YuEUdng15QO6v?UulSS-0( z`@AhnND{)~A#0$K{Se8rmzoR}`p6=&Jv2uuV_t~`!4EL|68;Hy)1#*>KG)=cj=@Pv zau9!cSnKrjjKLWSdA-O|yLXdi8sF~Kh88!K_rm9NgIHQ<>qE-=Xb`VMZk(NrEKzi7 zem)|p7AfYFf(4?qFQU@ou%0W}`4p^EG(x*s)C~>NDrhbq^kj3OgHP{j*<3rLa<)Qj z3Gez4ue8h}o1wQ$c8_}48JUX^NAymIuY9)h8##|Cxs-DPz)l~3h z5E7H|zbQRD=sCYTuJ>wsyvaE|^Rw*}ai!p74py|`RhXyeFG->bN&fv=SR_im;g9EJ zME1!88zTpv5MAsdh7DEH&GwXZMVH>7B;`qR?O{B{|D_`02Pz`Pyrdt-dmRtIeT;R` zpA#S_f-v2!)=>RXeV_3^1rcO7wnYMfGFYhGKR=}O_Ya9|x!79Pn`E{SIX#NIca>|2 z+%EkCgVY+L@3iOCr||KW;=2Ei&)gOA%`qNl91hCOAe;T$#E2sMUSTTZd$E=6AXNz- zJIJPjPfM${mJQvxUHzB0 zRCy4WMWZ`vAJJ^f4{@1w|DU6@_R4kKQ3i*3U=0Q~1u}wM-|5?B^j-cv&&^4=I1!oP zbB}}a9Emo(S`hhsg(W9=XHn(b8IuX+P)5-wtC<*qYHY&a!z}-lPq3cLf5i*9GXYKo z^(ou2^jw@v-9Fuli=V@E?M5p zD84V6w_AH%hLf=XAqYQU42E1-TEcLlZp}8m;-knfc$LekjFH;`MVIYWQyF9x`^lmX z^u|Nws*@Aik;1kL-qyM2>yHKPeqLlzjF1D281IqY4XT7;4<=vdu18N&M3_F{y=Q8j zKRk5k4yon8LzZBSF!GRIxu2NoHswNs=*v71#Tqp9%k1-h1pZap+Bk^N3)82AY5dP( zuOk%1-n|{mP|0iI9YePXaK_dxOI?Vc+E_<5B<6PBLlKK_3pSg7OKg9__lTRiNeVrR zgv(tTk~2#vl~%e3BYvmyGSB)}(<^TL^{3YgQQ zje)PGEP^k7QsIHF%ci}flS0r>7hDlvaehDhfv4rlmBFIW9!q~WM=@+@r$Y(QV ziVB$u3~uU4l9YG9VrTRh!`^uFiQ_I-rW0Cl8fYd8t|sG3{%;eBGm~%EAT%Z4kM-wr znVn2guO(;6KsRU5QOZ``OgjyH_w@Mc&0F*d1t|QbCO6ErsFK zz7M%S?(KN%71D2tkBXO&&&Zp=gfpM)NqJ8kZ=%kE)B6+u`&ju7`0IVjWX!Yn1Bg1Z zPw{V4B8TPCL3b(eIJV1?Jb6BjweXE59`t7X<8;Nf-LdKY315N4aTDzn-Sg{s z%sqLj#y*m~m6zfdr9SzM{EsTbary~Ig0|9rr~=ii-U?DyncG@N`PG!t(rhA>0oOA2 z($mtTladUdqb`O#lvMpO-4ng&Ht~$ZLGtU0l)l3QQ#FaA1!E$!g}1 zKSLFs-G+$(R|KI#Ul3T=`YA7o#g7B4rkRfvCtM#?az~(L)Oa&NVH2(J9i!sOpy?52H0q^!^q6)Vki_% z-sO!^-{D$CAXP6Tj`2-#GU(7(+Y3v{GAaK2&l(blxb~qGpdgtimYJbN1>>qC-a8~@U zM=#*8aBPd$wbOu_FCI@=g?nC((7^&Nm!+x=y3`&9bq&#Lx^SPBIK?Ypgv*D18msf7 z1&qKK@Br~NNutoJfcVwb^9R{Cx?pUuu36ONPHf1*UtR+DezzCvkm7@UQ7!T?>(_jg zp+o%a&chN#pSE=-MiXY>n0Km23m+N^K|iNm6*BJ4FWx?8e*SBBlHQ!m1@;9;YTkt! zd*0%7I@m$I>HGlDR`B0XEH|3V6&*M##W(SC@~iG<=Ikz!*VfERScd0Sbpw2D^pVfz z(b@H8MzQB)1f(=UfHC9t9bF=-J><1sJ`4DN{ffrUEY zMb(@TacO-%N2R)v(oe)#E);FmaY_$58;3Az*(h=&9X&M}{W+)ckFd^pRPJyw4odv< zG-Ensu~$AO#5UMA<_yN$>sH#EN~XEwd`n)@lV#5vcU@buvb4O#!}FuNqp(v)cNr1` z%2$7$O;~-wix)3UgiY0Nu(Jq+Hr$yvTiCxJ^(gRToU-6ganKZ~_u1(0&I17XAt$Up z_SE6J(+XVI6gKdBr5H2&B0CIH!gn6zL4CWUFv0&D)t0>*L1xsa5h-O&l?shti)6~W z_aBh7s#;4@mCZ;0(Qt@Pspmvyx<4Q``= ze@gVY|D}8z!2oapSbp4WV z&`6OcRqTGq!5_g93x6o!g};vlp(_*LwK1kiYi-Ziyh?802#sOP?XrB86l&?OhF#b2 zDKM4$PAXcx0M_HeY-UVqQ(&hbN-=`2HAYRsKX21E0jt^ln}=)dVb6_;9~!y03$Blq zny|2W1>)*JdbtuDD5qH~t0j}J<@~3`X7`OTeaaRJ7|^0>0^H@(I$QmO1nlOft?fk3 zl_Zf@KVU@4ahPN&ud7ZgJ*2zGJL2!gORY>dKJ{d%W2pu+y&{bUhw2>m7dh@472$Qo zar>@GgvH)MPnKGdj^rCM_QNf@KAB=_kdM@)weA!^EqTm`JBLq}lM0KS+SDwTPva62 z{ADkZ&Myq4?;%%Ualspq;hbT0(CLd>*umBVsu?}Y0w^$et$;row9R%XH)HswFVZws z25G)qA(qAbYs|?pZV|07CFNmo@)l=pBH3W>=YaxAb67%Y5uo^?6Mg+fy9@5LqG~%` zg>PT8NAOcMbFN7vz35Fxnx-^XF_NK0OHI zQUtHdsoVY`N8YpQktIga*LZ3Ydlx@(qtA7H;%RY$qPa>+d#)EkyTgEhfZx7=fWY49 z3aqJ7p0I(b=6L3;9WeBfk75Bc^=v-2&fhnXWKINote#MT?ST~Gt-Z)}K#lPOKHFy* z+Zb93if}b)YF~0T&FO(wHL6HGhzCWNUS2b~nnZAha@?o4XR;g5k`od-05fs7ZAn$a z_RGQJ;2&D=XN1e3J(nRA-o_~80p)I*eCSCAwx$^j#<;-uM-1)v+884_hWD{RW?=!S zbV$Oayb==<^a_oeBC&IOn)k7jKVB`sTsKWDmq7z|3?;8|_Z~I^Z5BrZZKq z46|!MC;PfAWl3dJsOoMjShBla!OEH2Ftxq?>5zuotxamBgFNKY#Xq@$}!vdj|-;8@oGNzJ=2& zx1hi-%!TsS)f4u?-}Omj>Bw8v@bCbqF(GKjZ?5Q*ZcC4p3}_{$O;hYM*0n%ue#PQu zwxGtRlz?@t*d75qxIQgEKR@0%z~{syxh42(2LUNLioDzwN#Ep#P-z03$_I-qTB?wQn8mH1BC2r#miP--YwS>z8|yimi?rz=RUr zf)w^VUJ(>4HB<;e(1U(-$FV9G!(ccD$EnNxUE~6B6Nw`I&yl@#42*m${Y2#aXbWCgL+WO0k?&lJ0@MU7BR zFql6i?FLFw@Yzgy@jTX5*}y2*JM@f^NGfoTS0^(?gzYAR0Ip4S%@-RhaS83}5^~z> z>?-^ivau7@AiInHzBb}}aEvfN3A%>&uF7S77KS|)x2r?mlt2#+o}4W3uTH`l0sXr6 zy~9YA8cZuKXbmjba|37Pcm_%e{z?+OR$$N^HuB+efa+^^P;Ih-uh^kU;c$DJcCs7` zempWZ{){o6|J8)x;_|W$YLHFMv}dAhtQyLQXVTP4oTZ;G=6ES*S}G^iEvS+XKt3Q@v_k?z_e% zWXhjV?`R9*=fD*_Z#Hkn?=;eV?-jO4^4@#XH`S+&+#T>5`VTF#rw>I3qK)tUu)5Cm z%$h7^-RZ@y(|A}r*0u8nYCBqS7f{d7HDEn1Z;05{ThQ~$`a3R7?GVw5-2m6Re*0N9 zo|&iknjui>p(R}AWslysA1gYSE=@yBz-N96$QKbLde6Lw#a!0?5YiaYAFn1OUKy5~ z?bg3P@ji8q8_%`3M^!8+0#(A;3M8WTrO2<%8Dg?1K#kUuBs{lFYcHeec+dT4Ewrxo z%;YqTx?(;gmFbrA+7xc&u;_Wmb-A`yyyqXEqG6&huD3!DgeKfJ-+i>4pAKT{aP0e`RM^ZM?dmd{8hjZEX@>uzY~ zTZfwi=bTa}yRtPW$8ht()^O{=I&Q~qy1Qsoj+@*@LFtMS zjoK2NV46zaap^XWV=_tDPOj@Fw{q)IB$1%~2oZHc0v`V-)b0h$>6Fun$xxuE1L|Uq zZXv~1i!o|*V4(KR@>*uJW*O%^4hwmRbbl7gZJxqj_5&L8^TB6_q)NC0B7AAdJuB34e!21#FpWDi zPpeHO?>zY&WFd`u2Qh-uS2=I_=ox$C1M2gFXV{4!FG3TAY`#1${q{&aIY3{)D$RJ> z9r!HfNl{ij4K-=>qQIRdm%=HM-ncEnhskK)eOI=ycRWATx+X0_Q%ta`$V{a6J< zIv~LBOOZT}0;KN?)!BfSdj%Vk+7yrq;=wm7`Q`o42T))yfE`H(+xO^kcF5J>;5XRX zJqlLWl^YcKX%{SFIkZHo0fO{J$k`SGo9Igj> zOX0NK+w%RzU{qApJNKh?)BVK`aEPw~6Mp_2n9phufk1r?z29sY=+kiefO|n-nSAEvp+KjvYY+wM5TF`ck z4BQ%dZD+x6een@M!R#Eu6HRO&X#YN?*28?_7_o5B*Jj$#h<~!gYcHQP@+xHOSj4pP zVi@{RU?@+Y{AgqN0-i0HCQoXnaUxeUkRT>z;3o!xX5vlI_Q_3@_6 zdWRO36iNw*b`hs5cm)BL*>tb7UpT!9a0XV|=UAwYTPQ`HSIIDkE7IwJd=U&`b6}2_ z^sFa;aDU*`kr~d>;a^_huQ<|U!3j=bF~{89@xm8~$l-5SMZoG*t&YOY6(dYHtzc<` z7Rga5DFGml@m2eALqpT0V$%f$&(pQciac4xuRxoqJD#7aABvaOUf*WkY6AT3(`s+Y zw;;>5ko8y^T18<_6{uGZ}Au`+W?%&&Pu>*;UYfQoi+ovYBKIcP4+ zpp5h9;NU=(Y18#|XmYi41E%&&T_}U|fgcowW_&Z>!G=@bao!xewo`j1HBoLKi9A?N z0}J*j=i@~()6?%SvOa$FBRHb{@~ryD>QFX00Wr~7#Wb$>7p*DH?DKtNrNEjfNPC>g}yKe zMP1|2$*owRC`S!usI*PG1$rk!kas*)UgawgrMsm3U1Gj&p|vD_7<{0j?0&TxIr9Xqq(MlxfG9`hpMi^VOi`{0dsL#PY-vT4QN^; zu>{h0^+S{%2cIkeWkWdT$iC*FcM_<);TNFBWBJn3_)JWoPhc3y?V1Cgp@L_$N9)5a z^DUvc0em7FiOcuzR|bVgRA!xK+I8rBD7HK@z^z@}vym%+p%qLT$3A4LIqMa#z*KGY z1KM4@df=4#>}Na=!3lzRA5jnx(Y;HutE1M+RBdqTlMKx*th@;#NWVTsP0!Oyw?KOS zvU!`g&prj`?5|1h@TIP}RE-4%DnV;9yjfcX0ulyMKX7{Sm~g|jUY%R{g3 zByq}7BM)M{F92C*J*##N?w7Wb8x-7Ih9a67y|JPnxbz;{+3~2-NxyekXf^E`;jY-X zV(I_-m<0%>sQ_;XY3wVYdoLSE3SyKC6?3h$o0{AjS^A~R@}uw`L*aC#*c;mUALcuy zp%_n3^pRdrc(|;pDhcLSBO#TWs7atDpyFD`6AKXa<-AR$m($3a=2LnV> zVPQnJlU2l9V&4brkb}MSI8YC;&f>n?&P;fB7?Ja4|Fuh`n{8{~1qEMBUBu(Fo1%;d zycM=n->*4Y^)+}MPltY8Tny!bcZ9t_ctyG)JSbz>yg~^;bYvCD0F;gBaT08Wb*EPW zTdgc^OuSn4RdAc_L zu@VabgL0ej&W^_?n+JWb&t8?Mdm{HADJeC6Q%QQ$ZhkHiAR=H{UhgkH7JM~v1CNa2mC+Ca z@qKNO52T`Uds(kQLJUP-6P2L8%2s=V6j{fi@jg!ZcMWg(lP`nL2orc|Ik_E=4^OE;g4oYohx z5BmlI`EQ-PQHbwleSQ6>)pp!s;4U3d_O=xyR}bVHihxuM1&5ASf8GlLyayT0N+*a> zY}4)>%WKpLKb^#DGC=nI5L~_fjIJf?kvtACd#>DkgdJKN9Q*FTV%d}EpKthMJ}0+O zAwN;bR8HO$1 z;4uQq2!e{X;`FxuA1buZEv!tzQCXcR#RR3usa2T$##9p#|b$;s0Sc_w-AaZFSYDz z?0q)k4{eWP4ho5I4OA`o7^c?h=|e&-5Wa3bTqTq!V!tiS zY(G$QALo)Z(iJMUPdB2q?^ixuWCTI)FOZ!(W2|7*$+^9dR9M&g;A~BdOMno2hKQ?J z`UEj(B1?T)Za4PBh4$v%r+6%4SC0{Hi~y4HuA^Y0-gFuo8WTu8Bo@7sG*pn9Ft;P?}AZX}OwZ#rs}2PyHJCohS9Y-g|^bGi6*643a*bk2_A53hm_G z4a9^C5JASZ9u%P%n1st!uDHTx81|6uHXCa-%DheOi+8R2>PQ)Fjt9~FmH(5f2{`tws|HVp59uMn{7Mx%iRf2%iJl1UrqP{ z!NH~?$#Re5&6bYAOm(=om+ef&H6VYc07$0!PSXcKhOZf_u}~+&buFP`&z0b znNLrYWodHb6VnRH<$}{suY($ee;<7DwBpS*;A8^;rk>kvxNzb<;Vf}FmM-eFOtjpS z5a>cXV!HdK0SAF@@*0GNP;jLgl&!Pt)k$>5snr+Iix1T3C=0&&d2u*b2c9(wzX0gz zi_Kbs_DAz{$Qiu^X)c_SK1ddG;dAe9qY``0j>EyzLpyx0>mTr)!x8s`j9Hd(8K*({ zi%>w#kP3i2-n*+5Tw?_09Tk{9Ks6!mw%Oc1Y1gzpU9C~=`U+%q7(tSubxf@_t!wF- zda5Trpx3#UEauh-7})nZ;`u>I=OzIWLr`ltO*+UHkJx{YKiU}^Fb@h3ZQ2|!<+tCK zKp|vFQ?c*f$KQW>$9oFH5&+?+WAs8@BOsv)0&>1zzoj(ewm8akHn$Kilc5ybU+~IM zI~S)X`a`~nfY?-yy2TwU(qn`J8Q8OR<-3q#qOD1{`jlx8Tqw~6zQ#=})2uCmeyq+# z95_tB3coj=Cv%s8`Id;FzwZ;-=IH}MnY70-cR+Z^rFzE3)z!(()WlDdkS9v{lf33J zX%r!fI#1*=^K!n;vSz&75N+w*-QfO0dui>v5C)Bb0RZ74Fen2EZn*8Lw_FdmCMk1u z3uQi-J^w5jsz6N3%qDUPIJGO!@c`31 zU<_iHLLX`Y@Qi)1HBnX!aVLT)nn#{ZjQ}GkKhS+ZZVT!kbbJ&B5e2ru634 zRv)SpkW=MzZs*fhDq(oNK2#8%CvTB{cdv2pv=xc zq0}Ve)MKPrT4cVKk@tf4fpfqT8xI{^5n;87ENQ%wlj+%)QjNt5as z@e=_$r~8S*c4<>XA;+gq^NUv`u&9He;NXUGgm>s-XY4@DTc^YIVZtswp0idG2fPt7sSWZUf{6v|3sN2ljOHGAz5kPf$ekdD+pJo-Y z*Dy04@xrfYfO`*0vajN}JyY-ogiUrluA5W-P}Biqdq>B^kES3ElnS&>xYtJuBLj$O zW)av^5u4G1@amnaO9+)S5@0VBKpe>DwERS_t$7ysW-4J@_A0j>*N#bPef{x~l}&dV zeMrhL!#tbYcl_TzYVzBkIbbwoQjPJk8~xCWsP&-ywLKkZqmzq&(p|s9fZ=vO+{D4d zC-I`^NF{dhs2)5CD|>!8d}7b{X4iyI;O1Q;oFV!Ca+JjD?C>FQ$*+5K^wPZoNmv!V zWA=`rD00O}`j%6d4V+%Kb4?ygmCIH{cbLE%bhyZC{Y+KspA}a=@j~7MTASHPdr%mj zYod}iJr6Ra4qJVN^2rk}Azm0R-MpZ}R;Vw4`18QAasegTcYBC1MNmA^5Msp#zlu-w zW+7apzr;eBPRg08<8jBTvp$>WLC>i5cp5&)3_p~!p8Q6?KAL->DX0;kq2FoPmwk3q zuhA~nAe*zdCVj55@=hK4mm$b*(SwAw0`?r*VI|oORAWhqm?R~M5#DFqcA)r$%hAHT zeo=$FF;KR#v^rkO239x%;AJCiv|+6c#YlnSMu2J7J{udG`BG=>YJZ*NJ%M}0ujgc( z*F5h7Rlcz4>fJ_JnVWF-mD6WWMiJorQL0Iz1Nb_k)Q^)0dFPoDPVR3!w`;mVeT#)l?>?lIt)E1pBR?g%2)0$ zU87_Sber*}1u8Zg<#x|Li>8DCX_Qp0%-$@G(mSnC0frvK?++Xuujl9#Mnoz`wnnAO z0%5~&Fd&NWOF$x1W;0wbN2!9XJHvR?9E})`mAa9-AFqdBV^J_UuB(j~cjEyD%vaCY z3x5MB$M=XJ!T@vtepTOkAPwJUDC-;^fPifw7G2=yB?VuN+`yjgD-+R+-2nBCHj1VI z^OIdu>%ni_hnDRvZdmE$PXQoAIuDA#4Ir`&=L#TI1c3>kcjHBo)Q6JAyO5Jx z0OWY@fS@b1C6qE9Aof-1FVgPEoBmy5F1X}R3+5cNxImYC+-AIjB_N=MD;1nSuRbbE zv+ta`xrS^IZN6j4=OO*&XCtE6iBbx?DL_OeNM_ahxuvGkso4F3fhO#1edp&l{2A5TEws5;Hw-cM!TxztOHa)A-_#cl{GRMFujL7Sn=vDe8Rgjp^eZKicl zaO%E}xdWhW#Cu>w-ETasi;teQ}8Q$wTDRk)KhBxPz&xDA%*!XTbN?$Y?FR{Qi zu7IE-9N@h#5G-cZ6S>5fb>a=B9v`PVnq$XptGM^+6`1!v2gnk>Hxi&ErV*5T@`UJj zYH5Eg{b{8mt8Tu&FHpQ$Xxo|`D0``=o%i$_4k}ZL*-}-xZA4U5JSAcfqym2IZEz(9 z=fHvIqQ%Mk=;)z|YTb`o{q`0dS}63GiZxk>vNSGeeN&b9Jw0;x)vcdrRC{$x{CgV; zNf_lme-Y%_0&RwKLGaF*h@n_Ha+|Iy1Leqbz+wdeFgpvkhlj%@(3C(aJI!&a^U>qS z4JUh$g#cQ+W*>aQsLvn$a1jXzD6NOG_(A|xk$a!3oh+2@UCs9Zq91o!E?evj1 zPW|rbG5Q$6!pe#tDX}k(0~vr3&{`eNAcc0mOF%;RE`;Jbzf0$hDG!7f-Zf1vtzu84 zOAf%G2-;0uhCq)fs$92#!nE5w_*>_2H^|ddA|R3~V!0>(X~q0! zXp9QTc3c9vsFoS8v;OZ6=5o{nxR-;PoFy4Z+KvMA?iHaL=h9g4OuX2tj{%o<5_j9G z|CynzQRaBHoe$*2n1%`wU$j@DPi%>BDSgn=kOmqJepQ;}>6a43u&F43BGbH?xkFcv zi1`>rlX|HoH`NG@TrnE+;X0RTOXrd(s6m2)#yi+E7gmEGw!yq@UcpmSM!?w6F2JcH z!F@Apk4lY~c4HVRct&_W)v7NA7#%Uy6p8n(;k4CznReZ_{A&gzrOeG~cafL=eF`lFi6hr(tVln~5zUqzaN*X9K zWzjBXR0`3;J{k0T=*O!3$)smpNc8RcZOloVG_#1vC7ibnAZ84Rr{cmCfs~l%eg|8{ z`g$%XCWPKET}i_ooADBS!20Iz=XeF=KpcasFpQ#a@F36w3gb6(Z=LJ%1b|3f6G&6~ z=N4971)I}|qrN)@#S2id-7fJ=R|p6G#~;WR-2$YA92`0n={au>c`F_7)zKYG6EWPQ z8sO(=!VA60(>Ss<`Fg8tG|et~B3{VjCNPTrARM+Hs$l;1Bq0QZ2|zwiJB(I@I@xJBxP(s7{58UX4N|nvZ^Pb znl(`2U@mCePX^Sr>nZez$`2$if9rVq{SCj(a9;4u9z&oa|KhVmLI^DmP|^y?IXW(x z!7;JgXKcU&oqnd$P?JIq3FPspX)y?An+@ksPi&qANaMv^kSQ@_zsF>hJ!hySx*Wq_ z0SdnSo+lJQa7!ph59f@bVYGHt*FYc-)JE?T5K#qXYh{}Be!l;-&hx(TtC=8a2@KE* zTRqprw;8Im*A5450@}cYfdU}7F65wefyZQvz_5T*6Y8;DNePtAfiyiysP|JJsalT< zcpqZ4_*^$LEA~6Nu0aYU>QM6nUo$cmdc}7h_?{B0gA)C9ek>6==pJ$7BCIu6{9jFd zcOca9|G%O{Mk2CODYFO}nWdyi5>fWZN>+BpRc11>%eo>Ydy{cwWs`mO&N!R9Q|t>(2Y$@AvEVd_5oI`Fv(SHR-rN*e2Wz@vNuFQaxHwhYpb1Jyq3u2&mnt z2{JDkb7~&-ct6Ytq9G6AO}V#=A+e3o(g*69y2n5%rx^R`+6WT%23!Ot|5XDOrR%fW z{gqrmJNxMh3bnGrK~i3TTJ$H>Hl@jiaor zpPv?4aQ<{z4i<`YtBV8z>E+Aokn$b5_{BD%RJ*W2NuJ32@S7<#V6^J}87fGONDbT| zfN=X+Y;ji&!$_iAc!dcPh=Sim|96zZR zq47iI*4(0<&%Zn?N;f_Q5_Bj`Bm-fG;ro+H9ugJ=D;UJcmfa<$yu-QKSyPe~WTC%B`aQR<9L)q7%KQD*NQr|7ei+X-M5d>S6=l4ei7heyTxPhw@ z_<@|WQ>R}Mvw(q&6*@T59$P0l9~E9;ihm`$UP}&)`Ei>1T98{vM*~SU>gnnE+g~XO znKS7KrD3~%0uI@Cz0X!jnJ0F&`q7A8rN@OG`^7)z|AB^Ih-5TpMNjNw*Xlkm*#PB@d3^mrIfmvwjXw~@&}$Y)4*&i(kNb?nG@y)q%#neS-X2UBem zB>oQMu*0Dm2y@EPx)00CNyGO(xrz#cW_|-qH$%)LAwxVeC<*ji=HZA53GQ&6U%26C z&j?_w+W==*8R<3?lZ={#gIiY9E2A`l#iSOem3eWp(j;g8tf3GoNMb5++ILk zINY^3PBM+%Powg-9w06xdxovmEDIg}t=FisTuU~^A8^XNj<)Rh)Kaw2ZXq`KT3Ap} zlYOm)7dZ=uvBN_&i9S4XMn1Z_Xr*41GMDFd2Si6_rz@b^jb@K5Imyo5gbCRO zg##R;`sdB7C`fnAe;xAK`Jfkjy_Wj;<-PZ=v%~D-oQ{$KHAPRZx`P9xhny9`Z0YV* z!Ri+(0z^=Nv|T4X*Nz7Ls;5^7X_Gb#K%sDM;HXIfSLM?(yQC&zpdd*b20s_aEg`{d z*=6x2C8fK{{3M(dWOtcj&f?9?Od}#9-qK-YjA!$F{1JyUTsZ4yI*7_&Tt*~5!Tph) z7m#KHnYJ0&B!ffPY{9OW5u-l5r3GoUB5`j4wGOn=G_0m^OIOrtueCL9Z#fTot5U&m zKt7$^swMz0lmIJ(Ab~eqO{@Sq;>g=a0KI`7zhr7QbBdGEw?QSQ)$ee^WpK>61 zl4oCbIzotz>nW^T==2@8G25#?6KJkry!ovK#>MiH)qX$_DJ8NeCc`9wOL&j~C0X3m zFmLeJJEfBb^1cxfpZ)zPY*@Dj%ZTVSC1qvbzVaGVX`&}~RS6o#ZtTjeorn4fG851y zL6y&JTN_U0ebu4AGF(Z2ut#6(T!|8WyS`ceSHZH;mPN;-oEJ~p^{#Pk z06*tLkTOk4?I~1J)yn=9wCv-^NrDg8-qd*SL8J8@sfhSsfV$HV2T0iP6ep+e1aXS~ z@6cl5hiu}B7~;#OXB;uo8^|7pKE26pZoeXf_p$b(W<4oNpRSo41uF*4dgadFx3A8$PAv=`a>%{j z%@^?GBeb@}IAX*HCm+0q3Y*P2=+$)~=A_0kR5nqQn_&i2B}r6uT^*t#gBH=urFLUK zHUuFL7ZYQISKhcW(`*v2{{j;p`OC5pOL=N%8zNf$9Z)`~sYrDU(%s$C#bgzjE0;%F ztOrm3Sw6zQszFWXUVsBf^V4ex`MU^$h&+Cqkwf0=1gDJQ@uMc#0^#5>+f95nRAVbc^6lMGV*T4+ zBnio*>Nf(#WCjPZi-GL-j36&q zi)Cp)dEmUFlti?iP_G}cuMU;-#2Qc59>MKk+`fQzNJerbO@bhPy95ZSX&luzq?~WA zfv|Fg-zFG37D%M)^vrb5%U^3X?14giO z)#a^~lZ%M-43(R3-&|qNJ^mjmM{PucMEuF)pVNTOcf9@@s4C(BNmCmZkqqX>V2UwY zpR5b|5LzE!Vv|#-Nu!mg!3q876^qi&FueYt>T1;(_{L!*Y-kF;f2vWayv)4lHgY6*-2r^Rk%?*P9 z&?U=HKYL0P!9#_hLPrAgu~&@(!Z@YBfCGrs+P|m1`I^oAgX>n^WO`+`jbQS6$*UdZQi+gaOtLE)4^r`WjyKlfU~EN_dy=$%(2C1R}7 z&22`-ZFTf*^*%PmX3!4$rjgNcNr#A8_V!dgJE@PTr`5gE+4xZb(`U^gWSyjPK8Ktf!Ss0e%1M zH3u@&B)06!&WARGnf~@Q=fWXT{c5o9id$OF>#i~I)XI)NQQv83Q1U_??#B<*jtgLv z;(ziu_z5vq$RN1HW}x=@-N0SUk!t{913AQ45Qn`;0Mm~+hEQCjDhFE0(KlVqJ^^rA zUyzq))_}3d5wDMe#&|2EO&TEZxwF#S)cPU>YS4?C(;6EZQ%wCyKkSP)frW_0_J)sa zYzpRmff>Z*nB9oK<0b6OLb`rH@;sX>Wby&!=^8+;zx`Qp77cN;%j(rXcdj`PouXM$ zI3YRi1rDimFH7uf`_3Xm_c_WYBu>W&T%M}NjyJ73X4Ev;A6Ou|#k_8OZ- zg|BLjVOmTkFVg2YP1$=n-|Tb#t=K;DuQ&f*g1Eh@LV+Lqdgq9aKxVG?^oJ(i`r3W2 zs=(zu)VV3{KR#CDx&OK6q8<)lpW*0>{g`K07mVmDuU+OilMyyd|u2%1hCL z;mjSnlYK3kLy$78A|`!6POQGuj+mQ$4jf+GS<#`^qq6SnWIQ3rpq40}R2}5_cikLm zP$b_#G;iLu9dVc)Vz_RDrb+tgOd=;mU~WpHtjB3md0)R_4n-odussiKW*~N)7ZYUc zNRVtM6|h3F#nkL#Z#h0T0V3RuM5%~iqz{1#RJUVd`NmThv-OIY!M1cawTZR|-0aS4 zj^lG-7s0_LVy1;rJ; zpG>y{=x#YX)5!0yi0OM`O0;iWIZBFl>ab)DLtZRMg5nu7VV$j z%6soyk&=wm$EKG_0SU6CwD~hPtxS|MZBZ}3`97p zJ$DrSH_y!O=`{eldbzB5@s8Z$vYgr@y}|sNyASJ*FTL1jdwlZIp6g>z&es^bp{r-9 zN@BZ@&FiT*1I^&f53^QIUOdk`*wDwXd5WDeG`afqh0AH8JVXUgw{u)iVtBj=Zgv9v zzf}}>Z%SOcqxkD0#oLcJ72lojrsWHkyK2Yv8S65B&f7Dw%yYbyz0$K!yVCMClkLkd z{$I-9ocwU*ZBS4#b)i7eshbzrCD8ZIdnVyi1)gBFpLBP9zke*5@b!Yrvd>z@lT2Bp zQ|FfK@_;C;JDPe>ev;x0U%#Ip(0-`(1SX!dfkol=gNd4k=H|#xABW7E?02C+rQ@^M z4pWF=J`QG?%+Af7=6HGX)1X4Sz0tTg(fc8&MS7)n<}(4IG_9TU=?QkuyORB#&t@UC zuj9(LUf8{1lJY9mp|Iy;b+rqBC9z`B&aAFpz$gNHcr^mOM^kjobF3iRbopNZz>IWrQE0DzG6EMq8ya_Wa}P? z9z5Rb5x&uAi(iF;DMc zF;BUR7vFuoy>)a6YmfO^qGdO7SHt82U7#<>E>U97PZSi0c;)YtTOw`dM&}Eb=Hgf* zPL9>`16LjOSwlPG z?+EU`!G5uV@=rFo6#-dAMfcl&ueTo_A38vd9z@SRAFv;~X>pf_gup#2Jp3pE%MZG{ z$AK$;7dxQM6BipH>HIy5;*oI(F)2xgRp(mr=qLxXkXK}#Z&F)3fW&OW>fpjcQKn!R zH3MXws-o#pet!P#wFxBnS)wA6A3jzI&N>&rRFH>ocb9tdq#3t)((+{O^t9=Ut7jRC zh(_z-w`Vgr_Wp8%sCxgNLvFB^j*b&(aF*6NJIj26S8v;N?3FB^T|ir|>U+EU0{O#; z{CM*PQ48|zt1f3Mrw@_RF7dy=^C35oa{I?@F&Mugj1+preY-&U*?QKo=g*&ijEPao z@3^a^bWC#0SxgX#NCuhy=Z9)Z3Gog5XEC6SzBeNdzol6|GVlhqFWJ1F-M+i8uL06e zz@-sg6GEFKx_YDPCtm}t!pv98{Ct_|38&KA;xy%5$vsiYB1h$t)~(bJa z`)b94NVMrZz2&R=P|0!&34Kp(MMaW(TFKwP^JUYx$#ZjhQz$=z;+IP0aMVnjMNx#z z^Aj2o8b@~ag!Rim=I39tG=0;e{_wsDSVcoPWy1U#D6kvi;w6bv9`C?A5Czki9?Je@ zWb~E0bjf%Pwzb*W>yqM5n+=ZCybsowmG9nt)&C|du>^DUB>^#35!D{z96-l;_xYVm z>IaL~poX(bIh>D)u|LhusQUOZ&=&hQT-S!xTwKKAuk%Vs#1aTzI<@W|Rfptxt)}ZA zITYXdQc3V?yUgqhU%ufFJmC5a*Mtf__!StuVH>99=7z<`v!xp%We-{b^Vu8(c>oqGK|PvT}kbUQz-B!Dh6ywF`a5 zq-oOb!Ob81+!?*LaMz9U3(k)MBHHI0PCN_jLJoum$4&hl)uN)Jmd?(aEAj{$V=z-Z zKuRQ8i=~Urqix=Yg~h^q+t$<7>!GuJWZgSY8#OQ%k-X!q`Dr=BzmzE0=-HLF*|J_R z>Swp!rqbq)7zDHEme8+Xirxf*1~;tA`y9G5dRYb*Gs-igQ8QQ$gZ(|kVOiI3i6;vq z^@kI*v~%^oloc~!BRRYpr%rRU`=wk2HVUkHH&(_f;~=ShyAz!Zolp#1&T=e}8|k?Vi9-{?34YC1X|KE9wof9}Km4SK)6%^EvOi6<}; zM{x78{cWaqOsdY`C3nM{%WR*=pnkSxqccrOk z72x$-`5Ke6vox%xOO2i$p{OiE>8>ki1h?JY%flyz+}}=4o=`S7N^UW+Uc7wlKG&m~Y8~N+NO?6?)vRS~_Cg3^ zaCPkEc=3A(67%Dtal=Ixy`y~(JUniIe0EuKaM*huWK+Nm@7IGIJPuHlMmB1inyF3! zy`)YHmOu@G)Rq8a!;;-M!!Pk>JTlPh7!onNukz5eG5E}b#HS%+=M?X_Qxp^wPz=BO z`I3+!zaP?@k@Y@2e2Wz|5D)g+I7hSQo`LaBFp2;n>q(~c)Lja=>+6z|y^^KEP_4}? zBovmO&XerD`;3~J8ho5QSFW@h_&gX#Od|$;R8>!YF}UpJv(a|!i(Ff;;X9PJ*s7L& znlzPjjJa_7=8a5`KYh^~y|gtQ77L-01De{p0iu0pBoA}f>AB<^pomz1=Umd^TXIT| zl>+7ApDyh7)g>gay_m@~Md5Lajn=F@2zd7_?gnJ#eC?;FJ;^N~5XnVYr+n~P)c=ys z@zhab?T&Itc>t7r?38b;;f?7V8F@wb1BSQXFOk>w`%vw?AleJp+$X z4*|PZwqpH$>C53?&B|fdyc!%VOX%ac7#Qln6=way&eZwPYHvr~Y|$tdti(#UZXKy! z>D10;V3-<{IE>;|FbA_sbab@Clqoq>JXlWDRQm-gGjNUtqT_X!I{PBvY9-49kELop zj_1-W{4je`h5PfNJ^scAzi)R0p!hiz$??@nkpWnX$S$r8l-mUB^=W~Mty*Db=Wiu? z>Q)ciB|6N0=9NV84H+@0AX8;`5YbqkPN7}R$BAn> z84ffbKjk~W57sXDG|OivOB_N?#%X4TRuE~f`at!yx0%`84w1R0>6U>3r_DgF<67g^ zE_O|!Hq33@qAriw;h=aKk6ULL_aqu@ZYk>#^79`VdShH#TUG7{h4adZkA2n{%j5cz zSpB=wkpND?mqYn)%W+c7^7u>MDJe%f3eDT@si{J_bs!M*Fgel%qJiUVR5+`MDaDte zjn0wcl2S1*oI@mI)LBV84zs3^lD?2=ED|@7G4W>UNmDtqwz0hwXJk4;){xvpN^ z_V>Ecqsn?VbSp-$ynVKVr(KbN=HkSbucTf?9mJDlvNz-K_%EhBcCh08Tf-R5%I zy6QA{!0SVXV`Hc0Kqq#ZOBXF3C8+!9W=M_Qm*-6Lkxo}H*=(7Wz;qQiHBB2y90K|! znMvvc=rT%k1M0arr&oqi3=9mNuqveXS{Qg9e5%c3Cd8xT*}&vm|1t3b#mKu8^z`IR zB&8z>(Q?2-+}{Dq&tkR3OL9wJnU&@*`wsKWUI1;V-Fl$`2Nu8G%z(C36K`eA$n z5JRj+Pw!3nUF0#6{G3I(kng=eG8^8RQ8HFnjU8*lz1t`*D=9E3S z`lp2a?nh`e`mDG#(%ADvXebMyr3<{x6-LbUA7N{atqSJcvaw9MyC9rM+s3S-*Ome65sg(8ZrX^)=ia?* z5fK{g32uU52R2&>L!CCI=K*TjftgMLx;Z#{oBeKWJ<6oP5CI;8;9)V#)2ys5y(f{= zxR$7FpSd%TE!=(h@L^d9>g&cudLj3ZAP$JW-ab3ug-VFLAN7}gEG|wbFQvFR`o|9e z`5T*5a2ax@mX`an`zxZsA9y1p6Wga1gfEE8#r*wbRa#vUYStVE`%dyS)AMUJ##J)6 z_2KlR44y#$SxU6N&J-ZtcO7G=mFyF6nEDt~G1Su{@=}7GS3TJoDJdWt3FU8FtCfh$+}u&h zT!)+xzDJ>~t35%I-kbtP2qck=s>AJcD*yUJ@}2ta z%Giva){OThcnACLvEU{b0R%%9kzY$)J4{q9As%_b$9NwaLjY`xY`q%uW`1-6H4Eih z^PMAW&z*hbK`^Ei7w`9ST@uT!w4(;_o;IaOj{f=#{5;&sq2Ef=kNcRNVH2kyVbYN-{TzE58 zZ+^3zn_dix(k^meBn5~!`*dzcLo2bxGM+=0+}{d!C9ivDRsRS{&@agD*}xz;7&D%{aD^Qik6WGghWV3o0>@lHth1FvMBJ2yoGdHKu~bZ$Li_#%8-X&!V!-bFR=+3p6B5~ zPj`J53+zY`_@0yVHQzy20pFtjNne`>iI~P(8BN{%nkW|2(b1u66FO#xHDK0BI;cH! zu-7rvQ#j{`w3GDhqc{RU!$X$+F)~gZJ-A7 z^76Q4W#8rJ=byWAsBqYfIGu2+Sz&aOyUmeBNa8dzn?N247Z*Cw?JypblXFeBH{NjM zYRsZ1txu7AwD@-a`0`3C%G)V zUjJV*;UNcyBUyr_J8)>6EhtM*>O z=Qv*tsYv8M|M}G7(AP14+ml`2RO{U1)l44m{p4jk-647Svtcyr|2|fO8(WsVuJ15! zZsWFQjd7Ad>T@EzEv{%}WBbx~xz^)RI!TF||MOen2NUeDF->Dnn#eH8{@aO9@rH4m zzSF$^dLD>WwZU|l_W93`J@0Mn&Rj;DMnhvRt-s&&ZJ^`RK(EiigUpg+r8iEkN=2Ri z=fjg;bL+)tt{3nAq;bjo)VF0n@wcywDRcQ~ao4HhijJ@S4F7!C!Rr{GW(y}KMm4o~ zm+EQE4q0BWz(jL&2Brjg<4N}N>i<3kcodY0Yw;%6Wz}-4FQUU#X3=i9)36)k;U3JB z)m_%Kh9%Zt4ga~l+Rc*9m9Xp4zqE!l_8$ZZ%vFBG>cie04`O^RjWD!CuB!qwY7CJIKb?lie+9p}+-#b|^aXpt6qbM#ZX`OSS!EWt@#KGP4iFBvX z-LMzl_4-cvg8!@*G8_v#oBoCLUw?lmXvCF^y6u(hhB~A0#}ZO>ZC1+!CV0w?Eq1^W5SgYOGJE7X6MI`@!L;Gb7{9@okIu5+@tJ9o~Slyi?QoW2^<;Jt+B zBUmos=sjc9`)t%$v4duM|E!kPjRZa2BY`q+oBrO*89=|SpIR?scHR{@G+_IM;CEFPoV)U8ObUxOFeu z?RbUj=M+%#>Z-a;&Le>nq3LO9#{yG1`|scR z;XN-}G8pzC@1Ha7nVI=N0kpEu-rhE&A~Pb)$B$Y^G(`J*Y%Ft*OuVK{qIxgeyXar} z!;h%JtQa4F89kdxaP4rF3&8WE*?#>{Egg~I92}-^_`hJ>NEGtIICQT%bfeJ$cJ^-O zFDhg642C6iZC-x4#?&bn+KRvJpUw$4C>EgoMVu{En>ww;iAwK=@B^7dmamVBZSwl; zbOu5nPfE8t<6C#g=URt*tjxa{xV$O0kuIrsJ6_f5@(?rV_KEx7GXOQvd}0$9AV#?U zz`w5KRqTjHPR>&Do5P7CaKls!c#eNt@>{@ zU#t|Z{c0e%sk`5qAfRMY$AT;$h3Ou#fsi%wwXN5o^GR zq`tV1mW@rq0D6k` tags) of the HTML page. Thus, the term “header bidding” was adopted. + +The code for bidding on web display ads still resides in the header, but with the ongoing addition of more formats, header bidding itself now encompasses much more. For example, video ad auctions happen in the video player; mobile apps call out to a server; and web pages can utilize server-side bidding. None of these processes involve code in the header. And with continual growth into additional areas such as DOOH (digital out-of-home), CTV (connected TV) and audio, the term “header bidding” becomes less and less applicable. + +Today header bidding might more appropriately be referred to as pre-ad server bidding. But in the same way that people in the U.S. insist on calling a game played mostly with your hands “football,” people in the ad industry are going to continue to call this header bidding. + + +## How It Works + +This is a very simplified version of how header bidding works with display ads on a website: + +1. The page starts to load. +2. The header bidding code calls out to a set of demand partners asking for bids. +3. The demand partners reply with their bids. +4. The ad server is called, with some or all bids attached to the call. +5. The ad server considers all available ads that could be displayed, including the header bid(s). +6. The ad server displays the winner for each ad unit (which may or may not be one of the bids that resulted from the header bidding). + +![Header Bidding](/assets/images/intros/header-bidding-intro.png){: .center-image :} + +Again, this is very simplified. The details of this process vary depending on whether you’re working with mobile apps, working server-side rather than client-side, or working with video rather than display. + +Here are a few details on the different aspects of header bidding. + +### The Ad Server + +Yes, you still need an ad server. As we explained in the History, header bidding means that bid gathering takes place before calling the ad server. The ad server will still determine the final winner for each ad unit. It will consider sponsorships, direct sold, guaranteed, and other types of ads along with the bids generated from the header bidding software. + +{: .alert.alert-info :} +Header bidding can be done without an ad server, but that’s rare and out of scope for this discussion. + +### Ad Ops + +Because the bids collected through header bidding are being passed to the ad server, you need the ad server to be prepared to receive them. That’s where your ad ops team comes in. Your ad ops team will need to set up line items within the ad server for all ad units that are part of the header bidding auction. One or more bids will be sent to the ad server, and the ad server will look for line items matching the key values in those bids. If those line items aren’t set up correctly, the header bidding winners will not be considered in the final auction. + +This process is where the core innovation of header bidding takes place. Line items are set up to allow external bids to be brought into the ad server algorithm and compete appropriately with ads that are entered directly into the system. + +{: .alert.alert-info :} +Your team may go by a name other than ad ops (or ad operations). When we refer to ad ops, we’re talking about the people who login to the ad server software and manage the campaigns and accounts. + +Ad ops will work with engineers to ensure they have the correct key values and ad units so that the line items they create in the ad server will correspond to the header bidding results. + +### Engineering + +Whether you’re working with a website or a mobile app, banner ads or video, your engineering team will need to add header bidding code. The header bidding gets started by running some JavaScript code before the ad server is called. The ad calls on the page will be delayed for a set period of time in order to allow the header bidding software to gather bids. + +Engineers will have to work closely with ad ops to ensure the key value pairs that are being sent to the ad server with the bids from the header bidding process are included in the line items being created on the ad server. + +### Revenue Operations + +Header bidding does not compete with direct bidding; it enhances it. Bids that come in through the header bidding process work alongside all other inventory in a campaign. You get market intelligence, the ability to set CPMs and priorities, and you’re able to ensure bids coming from header bidding don’t interfere with higher priority inventory such as direct sold ads. Header bidding fits into the overall process without interfering with any contracted deals and obligations. + + +## Managed Services vs In House + +To fully maximize your revenue and performance, header bidding can be a complicated and time-consuming task. Because of that, many companies choose to hire managed services companies to take on the work. Depending on the company you choose, they’ll implement and monitor your header bidding and make adjustments for you. + +If you choose to keep everything in house, be prepared for your engineering and ad ops teams to spend time not only getting set up but also making adjustments and updates. + +Both options require an investment, but it’s an investment that has been repeatedly proven to pay off for most publishers. + + +## Bidding Partners + +Obviously, header bidding involves more than just putting code out there and expecting bids to come rolling in from random sources. You need to select your demand partners (SSPs and exchanges). If you’re using a managed service, they can help you with that. If you’re implementing your own system using a wrapper (such as Prebid), you need to specify which demand partners you’ll work with and how many to work with at a time. Select your partners thoughtfully, and periodically review and adjust based on results. + +Along with your demand partners, you can optionally choose to work with additional bidding partners. You can select partners in yield management, user ids, real-time data, viewability, and more. + +## Dealing with Latency + +As we’ve mentioned, header bidding works by delaying the call to the ad server until after external bidders have been contacted, which allows these additional bids to be sent to the ad server when it does get called. This can cause some latency in loading the page and displaying the ads. The organizations that provide header bidding solutions are aware of this and have designed ways to minimize it. + +## Header Bidding with Prebid + +If you’re planning on creating your own header bidding implementation in-house, the most popular option is to use Prebid. (Many managed services also use Prebid.) Prebid is a free, open-source header bidding solution. Learn all the how’s and why’s of working with Prebid in our [Introduction to Prebid](/overview/intro.html). diff --git a/overview/intro.md b/overview/intro.md index 23342c615b..31616ba608 100644 --- a/overview/intro.md +++ b/overview/intro.md @@ -1,131 +1,170 @@ --- layout: page_v2 -title: What is Prebid? +title: Intro to Prebid description: An overview of Prebid org and products sidebarType: 0 --- -# What is Prebid? + +# Introduction to Prebid {:.no_toc} * TOC {:toc} -## Overview +Prebid is the leading header bidding solution. It is free and fully open source, available to any publisher who wants to implement header bidding. This introduction describes Prebid and its benefits. For a general overview of header bidding, see [Introduction to Header Bidding](/overview/intro-to-header-bidding.html). {: .alert.alert-info :} -If you're looking for a marketing-level overview of the Prebid software and organization, including product features, membership, events, and so on, visit [Prebid.org](https://prebid.org/). +If you’re looking for a marketing-level overview of the Prebid software and organization, including product features, membership, events, and so on, visit [Prebid.org](https://prebid.org/). -Prebid is more than a product; it's a product suite, a community, and an organization. +## Header Bidding with Prebid -- **Product Suite:** A free and open source suite of software products that enables publishers to implement header bidding on websites and mobile apps. Our product line includes: - - **Prebid.js:** Prebid.js provides a powerful and easy-to-implement code set to improve header bidding for display and video ads on a publisher's website and within OTT applications. - - **Prebid Server:** Provides a hosted or custom server-side solution for header bidding. Utilizing Prebid Server can reduce latency between bid request and ad selection, and speed the presentation of your site and ads. - - **Prebid Mobile:** Our native iOS and Android solutions to enable header bidding within a mobile app. -- **Community:** The developers that maintain and improve our products. -- **Organization:** An active membership of leaders within the ad tech industry promotes Prebid products and works with the ad tech community to define and implement enhanced solutions. For more about the organization, see the [Prebid.org](https://prebid.org/) website. +The Prebid.org suite of products leads the industry in providing header bidding to publishers. -{: .alert.alert-info :} -Our flagship product, Prebid.js, is sometimes referred to as simply *Prebid*, but please be aware that the Prebid product line supports header bidding for web, AMP, and mobile apps, using both client- and server-side components. +![Top Header Bidding Providers](/assets/images/intros/top-header-providers.png) -## Header Bidding + -### What is Header Bidding? +Prebid is more than a product; it’s a product suite, a community, and an independent organization. -Header bidding is a response to a fragmented and inefficient process for digital ad display. It is an alternative to the "waterfall" method, in which impressions are offered to one sales channel at a time, moving down an inflexible stack of sources. -With header bidding, the publisher creates a short delay in their ad serving to obtain bids from many SSPs and ad exchanges. In this way, publishers can receive high value bids on their inventory that may be unavailable through their primary ad server and exchange. -The returned bids are then passed into the ad server so they can compete with direct demand and the primary ad server's exchange on a level playing field. +- **Product Suite:** A free and open source suite of software products that enables publishers to implement header bidding on websites and mobile apps. +- **Community:** Our community is comprised of developers from companies across the ad tech industry who maintain and improve our products. +- **Organization:** Prebid.org is an active membership of leaders within the ad tech industry that promotes Prebid products and works with the ad tech community to define and implement enhanced solutions. For more about the organization, see Prebid.org. -### A Brief History of Header Bidding +![Prebid organization](/assets/images/intros/prebid-intro.png){: .center-image } -The early days of header bidding were dominated by bad practices, proprietary tech, poor standards, and little to no cooperation between competing companies. Publishers were presented with the confusing and time-consuming process of having to manually patch together various solutions from different companies and processes. -Prebid.js launched in 2015 to make header bidding easy for publishers by bringing conformity and simplicity to the header bidding process. By creating a simple, open tech layer upon which companies could add their code to a standard but optimized foundation, Prebid.js made it easier to implement header bidding, and offered the largest repository of working adapters. -Today, Prebid.js is the most widely used header bidding "container" or "wrapper" on the web. The ecosystem supports more than 300 demand partners, about 50 analytics providers, and thousands of websites. +{: .alert.alert-info :} +Our flagship product, Prebid.js, is sometimes referred to as simply Prebid, but the Prebid product line supports header bidding for web, AMP, and mobile apps, using both client- and server-side components. -## Benefits of Prebid Products +## A Brief History of Prebid -The Prebid product suite offers publishers multiple benefits designed to foster a better header bidding experience, including: +The early days of header bidding were dominated by bad practices, proprietary tech, poor standards, and little to no cooperation between competing companies. Publishers were presented with the confusing and time-consuming process of having to manually patch together various solutions from different companies and processes. -- A free and open source set of solutions, enabling anyone to contribute or review code. -- The largest repository of working header bidding adapters. -- Asynchronous and single time-out to provide a better user experience. -- Prebid Server, to run faster auctions with more partners. -- Modules, tools, and analytics support to optimize publisher setup. -- Multiple options on formats (display, video, native) and channels (mobile, web). -- A well established and helpful community that can advise on best practices and, if needed, provide professional setup and services. +Launched in 2015 as a collaboration of several leading ad tech companies, Prebid.js was developed to make header bidding easy for publishers by bringing conformity and simplicity to the header bidding process. Prebid.js provided a simple, open tech layer upon which companies could add their code to a standard but optimized foundation, and connected publishers and advertisers to demand side partners. Over time, more ad tech companies and individual contributors joined the collaboration, making Prebid the most widely used header bidding “container” or “wrapper” available. Today the ecosystem supports more than 300 demand partners, about 50 analytics providers, and thousands of websites. ## Prebid Products +Since the launch of Prebid.js, the Prebid line or products has continued to grow. Our product line includes: +- **Prebid.js:** Provides a powerful and easy-to-implement code set to improve header bidding for display and video ads on a publisher’s website and within OTT applications. +- **Prebid Server:** Provides a server-side solution for header bidding. Utilizing Prebid Server can support additional use cases such as mobile apps, reduce latency between bid request and ad selection, and speed the presentation of your site and ads. Can be used as an option for managing the number of bidders, with some calls to bidders through the client and some server-side. +- **Prebid Mobile:** Our native iOS and Android solutions to enable header bidding within a mobile app. +- **SharedID:** Native hosted ID offering that is simple, free, robust, and privacy-minded. + + ### Prebid.js -Prebid.js is the core product of the Prebid suite. It supports multiple formats include display, video, and native, and provides a simple process for header bidding that can be ramped up to fit the complexity of your needs. +Prebid.js is a JavaScript library that runs in the browser, and is the core product of the Prebid suite. It supports multiple formats including display, video, and native, and provides a simple process for header bidding that can be ramped up to fit the complexity of your needs. -**Reducing Latency** +One of the many benefits to using Prebid.js as your header bidding solution is its ability to reduce latency. Latency - the delay between the bid requests being sent and the responses being returned - is one of the main concerns publishers have with header bidding. Prebid addresses this issue by concurrently calling the selected bidders within the set timeout. That setting is respected by Prebid.js, and any bidder not returning a result within the timeout duration is excluded from the auction. This dramatically decreases the page load time, providing a better user experience. (See [“Prebid and Latency”](#latency) below for more information on latency.) -One of the main problems publishers have experienced with other header bidding solutions is the delay between the bid requests being sent and the responses being returned. Some solutions use synchronous calls, meaning each bidder has to receive the request and return a response before the next bidder is called. This can lead to a long delay between when the web page is called and when it is actually loaded. -Prebid resolves this issue by concurrently calling the selected bidders within the set timeout. That setting is respected by Prebid.js, and any bidder not returning a result within the timeout duration is excluded from the auction. This dramatically decreases the page load time, providing a better user experience. +See [What is Prebid.js?](/prebid/prebidjs.html) for more information. -**Prebid.js process** +### Prebid Server -A simple Prebid.js process follows these steps: -1. The ad server's tag is paused by a timer while Prebid.js sends out bid requests to selected bidders. -2. Creatives and bids are returned from the bidders. -3. From the bid responses, Prebid.js finds a winner (if applicable) and caches the creatives. -4. Prebid passes the winning bid parameters to the ad server as key-values. -5. The ad server takes those key-values and finds a matching line item and compares to other line items that bid on this impression. -6. If the ad server determines Prebid wins the auction it returns a signal to Prebid.js, which then writes the creative to the page. +Prebid Server (PBS) provides a powerful framework for a server-side solution to header bidding. Built on the same core principles as Prebid.js, our server solution can reduce latency and improve page load time. A server-side solution to header bidding is required in environments that don’t have HTML header sections in which to put JavaScript, such as mobiles apps and Accelerated Mobile Pages (AMP) sites. -![Prebid.js Simple Flowchart](/assets/images/flowcharts/pb-js-simple.png) +When a publisher chooses to push auctions to the server side, they’re doing it to lighten the load that header bidding has on the browser. For instance, if five bidders are moved from the client side to the server side, the browser just makes one request to PBS, which delegates the actual auctions to the server, lightening the load on the user's device. -### Prebid Server +Several Prebid.org members provide [managed solutions](https://prebid.org/product-suite/managed-services/), enabling publishers to receive the benefits of server-side header bidding without the need to implement and manage the process themselves. + +If a publisher would prefer to implement their own solution, source code in Go and Java is available from our Github page and instructions for configuring, deploying and testing your implementation can be found in the Prebid Server section of this site. -Prebid Server provides a server-side solution to header bidding. Built on the same core principles as Prebid.js, our server solution can reduce latency and improve page load time. +See [Prebid Server Overview](/prebid-server/overview/prebid-server-overview.html) for more information. -When a pub chooses to push auctions to the server-side, they're doing it to -lighten the load that header bidding has on the browser. For instance, if 5 -bidders are moved from the client-side to the server-side, the browser just makes -one request to PBS, which fans out the actual 5 auctions across server-to-server -connections. +### Prebid Mobile -Several Prebid.org members provide [hosted solutions](https://prebid.org/product-suite/managed-services/), enabling publishers to receive the benefits of server-side header bidding without the need to implement and manage the process themselves. +For mobile apps, Prebid provides Prebid Mobile (PBM) SDK, an end-to-end header bidding solution for both iOS and Android. Working in conjunction with Prebid Server, PBM enables access to more mobile buyers and provides options for banner, interstitial, and native ad formats as well as video ads. -If a publisher would prefer to implement their own solution, source code in [Go](https://github.com/prebid/prebid-server) or [Java](https://github.com/prebid/prebid-server-java) is available from our Github page and detailed instructions for configuring, deploying and testing your implementation can be found in the [Prebid Server section](/prebid-server/overview/prebid-server-overview.html) of this site. +See [Prebid Mobile Overview](/prebid-mobile/prebid-mobile.html) for more information. -**Prebid Server process** +### SharedID -Prebid Server (PBS) provides multiple endpoints for auctions as well as data retrieval and supports the AMP (accelerated mobile pages) format. The primary endpoint is `/openrtb2/auction` and the process follows these steps: +SharedId is a first party identifier. For more information, see [Prebid SharedID](/identity/sharedid.html). -1. An OpenRTB request is sent to Prebid Server. -2. Prebid Server conducts the auction with selected SSPs and ad exchanges. -3. PBS collects the bids and creatives. -4. PBS passes the winning bid parameters to Prebid.js the ad server. -5. The ad server takes the passed in key-values and finds a matching line item and then compares to other line items that bid on this impression. -6. If the ad server determines Prebid wins the auction it returns the Prebid Universal Creative -7. The Prebid Universal Creative displays the winning ad. +### Modules -![Prebid Server Flowchart](/assets/images/flowcharts/pb-server-display.png) +Along with our suite of products, Prebid comes with modules that enable you to implement the header bidding solution that’s right for you. A module is add-on code that is outside the core Prebid.js functionality, all of which have been provided by a thriving ecosystem of contributors. There are many different types of modules, including bid adapters, analytics adapters, real-time data modules, user ID modules, and others. -See the [Prebid Server documentation](/prebid-server/overview/prebid-server-overview.html) for more use cases including [AMP](/prebid-server/use-cases/pbs-amp.html) and [Mobile App](/prebid-server/use-cases/pbs-sdk.html). +Bid adapter modules are used to communicate with the bidders (SSPs, DSPs, and exchanges) that will be participating in the header bidding auction. Bidders create these adapters and submit them to Prebid, where they’re reviewed and tested before being made publicly available. You choose your adapters when you build or download Prebid.js. (You can also add them in later.) To help you determine the adapters that are available and decide which are right for you, Prebid provides a spreadsheet that lists all Prebid bid adapters and information about them, including media formats, regulatory compliance, etc. Download the CSV spreadsheet. -### Prebid Mobile +Analytics adapter modules allow you to gather analytics from Prebid.js and send them to your analytics provider (such as Google Analytics). See [Prebid.js Analytics Adapters](/overview/analytics.html) for more information. + +Additional modules are available that support identity, price floors, testing, currency, and much more. See [Prebid.js Module Overview](/dev-docs/modules/) for more information. + + + + + + +## Benefits of Using Prebid Products + +The Prebid product suite offers publishers multiple benefits designed to foster a better header bidding experience, including: + +- A free and open source set of solutions, enabling anyone to contribute or review code. +- Ongoing innovations across all products and channels, led by strategic working groups of Prebid.org members. +- The largest repository of working header bidding adapters. +- Asynchronous and single time-out to provide a better user experience. +- Prebid Server, to support non-JavaScript scenarios and to run faster auctions with more partners. +- Modules, tools, and analytics support to optimize publisher setup. +- Multiple options on formats (display, video, native) and channels (mobile, web). +- A well established and helpful community that can advise on best practices and, if needed, provide professional setup and services. +- Troubleshooting and support, where members answer questions through issues raised in Github. + +![Prebid Benefits](/assets/images/intros/prebid-benefits.png){: .center-image } + +## Prebid Integration and Maintenance + +Publishers who don’t have engineering and/or ad ops resources available can still implement header bidding with Prebid by working with a managed service company that can integrate and maintain Prebid for you. See the [list of Prebid.org members who provide managed services](https://prebid.org/product-suite/managed-services/) if this is the right option for your organization. + +If you decide to use in-house resources to implement Prebid, keep in mind that regular software upgrades are critical. Prebid is continually releasing bug fixes, performance improvements, new features, better regulation support, etc. We suggest you upgrade at least every six months. + + + + + + +## Prebid and Latency + +With header bidding, the publisher creates a short delay in their ad serving to obtain bids that might be used in the ad decisioning. Often a major concern with this process is the latency caused by this delay. By delaying the ad serving, you may lose impressions from users who bounce very quickly. Prebid provides several options for minimizing this issue. + +- Minimize the number of bidders that will be allowed to participate in the header bidding auction. The fewer demand partners that have the opportunity to bid, the fewer the bids, and therefore the faster the processing. But fewer demand partners also means fewer chances for an optimal bid. It might require some time and experimentation to determine the optimal number. Client-side implementations typically use 5 – 15 demand partners. Because of the faster processing speeds, server-side will often have more. +- Use Prebid Server to do the processing rather than the client browser. Passing the load of running auctions to the server can be faster than running them client-side from the browser. You can also use a combination of client and server processing to optimize your yield while still reducing latency. +- Set a time limit for receiving bids. Prebid provides the option for you to set a time limit. Any demand partner who hasn’t responded with a bid within the time allotted will not be included in the auction. See [Timeouts](/features/timeouts.html) for more information. +- Asynchronous Processing. Requests are sent to all bidders at once, rather than one at a time. See [How to reduce the latency of header bidding with Prebid.js](/overview/how-to-reduce-latency-of-header-bidding.html#asynchronous-call-scenario-with-prebidjs) for more information. + +We recommend that publishers do A/B testing on the number of bidders, timeout values, and client-vs-server for their specific pages. If your org doesn't do a lot of A/B testing, several of the managed services can help in this area. -For mobile apps, Prebid provides Prebid Mobile (PBM) SDK: an end-to-end header bidding solution for both iOS and Android. Working in conjunction with Prebid Server, PBM reduces latency and enables access to more mobile buyers, provides options for banner and interstitial ad formats, and enables user to set global targeting values for the bid request. +## Community Support -**Prebid Mobile process** +If you ever need support, simply raise an issue on [one of our Github repositories](https://github.com/prebid). We also provide extensive documentation not only on our products but on how to integrate them with various ad servers. -The PBM header bidding process follows these steps: +Prebid also has an active member community that ensures Prebid will continue to grow and evolve in a way that is beneficial to the header bidding ecosystem. Through a variety of committees, Prebid.org members continually decide on and prioritizes new features, updates, and fixes. -1. Prebid Mobile sends a request to Prebid Server. This request consists of the Prebid Server account ID and config ID for each tag included in the request. -2. Prebid Server constructs an OpenRTB bid request and passes it to the demand partners. -3. Each demand partner returns a bid response to Prebid Server. The bid response includes the bid price and the creative content. -4. Prebid Server sends the bid responses to Prebid Mobile. -5. Prebid Mobile sets key-value targeting for each ad slot through the primary ad server mobile SDK. This targeting will activate one or more of Prebid line items that were previously configured in the primary ad server. -6. If the line item associated with the Prebid Mobile bid wins, the primary ad server returns the Prebid Universal Creative JavaScript to the ad server’s SDK. -7. The Prebid Universal Creative JavaScript will fetch and render the corresponding creative content from the winning Prebid Server demand partner. +## Prebid Membership -![Prebid Mobile Flowchart](/assets/images/flowcharts/pb-mobile.png) +The ad server you’re working with makes their money by taking a cut of the winning bid price, so you might be wondering if Prebid also takes a cut. The answer is NO. Prebid is free to anyone who wants to use it. So how does Prebid continue to evolve as a quality set of products (not to mention provide events and great documentation) without taking in fees? Through dedicated volunteers from member companies, alongside a small handful of employees and an occasional contractor paid through Prebid.org membership dues. All dues go into serving the Prebid community and providing a voice for our members in the world of header bidding. -## Further Reading -+ [Prebid.js](/prebid/prebidjs.html) -+ [Prebid Server](/prebid-server/overview/prebid-server-overview.html) -+ [Prebid Mobile](/prebid-mobile/prebid-mobile.html) -+ [Managed Prebid Solutions](https://prebid.org/product-suite/managed-services/) +You don’t have to be a Prebid.org member to use Prebid. However, we do highly encourage you to explore the benefits of membership and consider joining. No matter the size of your company, Prebid has membership options available that will provide value to anyone interested in header bidding today and in the future. For more information on Prebid.org membership, see [Prebid.org Membership Overview](https://prebid.org/membership/). From 20cf36d16862c14f8f1907084e8bfea8aff4fa86 Mon Sep 17 00:00:00 2001 From: Jean Stemp <38964447+jeanstemp@users.noreply.github.com> Date: Thu, 20 Oct 2022 09:03:05 -0700 Subject: [PATCH 046/280] replace sincera text with logo in link (#4096) Co-authored-by: Jean Stemp --- .../intros/Sincera_Logo_Black_Green-small.png | Bin 0 -> 19462 bytes overview/intro.md | 6 +++--- 2 files changed, 3 insertions(+), 3 deletions(-) create mode 100644 assets/images/intros/Sincera_Logo_Black_Green-small.png diff --git a/assets/images/intros/Sincera_Logo_Black_Green-small.png b/assets/images/intros/Sincera_Logo_Black_Green-small.png new file mode 100644 index 0000000000000000000000000000000000000000..f047cd9c5590a6ce6f3382504455bf00d6af181a GIT binary patch literal 19462 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 literal 0 HcmV?d00001 diff --git a/overview/intro.md b/overview/intro.md index 31616ba608..62147db0ce 100644 --- a/overview/intro.md +++ b/overview/intro.md @@ -24,7 +24,7 @@ The Prebid.org suite of products leads the industry in providing header bidding @@ -104,7 +104,7 @@ Additional modules are available that support identity, price floors, testing, c @@ -141,7 +141,7 @@ If you decide to use in-house resources to implement Prebid, keep in mind that r From 1d23acdde2d4c6c5bbd03f2920eab23d816e85b1 Mon Sep 17 00:00:00 2001 From: bretg Date: Thu, 20 Oct 2022 15:29:16 -0400 Subject: [PATCH 047/280] PG targeting updates (#4099) --- prebid-server/features/pg/pbs-pg-targeting.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/prebid-server/features/pg/pbs-pg-targeting.md b/prebid-server/features/pg/pbs-pg-targeting.md index dd8157733a..54d39deca2 100644 --- a/prebid-server/features/pg/pbs-pg-targeting.md +++ b/prebid-server/features/pg/pbs-pg-targeting.md @@ -59,7 +59,7 @@ The full list of attributes supported by Prebid Server may differ by PG Host Com | --- | --- | --- | --- | --- | --- | | adunit.size | Ad Sizes | [{w: 300, h: 250},...] | OpenRTB | imp[].banner.format[] | intersects | | adunit.mediatype | Mediatype | string | OpenRTB | mediatype="banner" if imp.banner exists. mediatype="video-instream" if imp.video exists and placement is 1. mediatype="video-outstream" if imp.video exists and placement is <> 1. mediatype="native" if imp.native exists | intersects | -| adunit.adslot | The ad server slot name | string | OpenRTB | imp[].ext.context.data.pbadslot | in, matches | +| adunit.adslot | The ad server slot name | string | OpenRTB | imp[].ext.data.pbadslot OR imp[].ext.gpid OR imp[].tagid OR imp[].ext.data.adserver.adslot | in, matches | | site.domain | Site domain | string | OpenRTB | site.domain | in, matches | | site.referrer | Referring URL | string | OpenRTB | site.page | in, matches | | app.bundle | Mobile application bundle | string | OpenRTB | app.bundle | in, matches | @@ -83,7 +83,7 @@ The full list of attributes supported by Prebid Server may differ by PG Host Com | user.ext.time.userdow | User Day of Week | 1=sun, 7=sat | Geo vendor + clock | user.ext.time.userdow | in| | user.ext.time.userhour | User Hour | 0-23 |Geo vendor + clock | user.ext.time.userhour | in| | ufpd.ATTR | User First Party Data | string | OpenRTB | user.ATTR or user.ext.data.ATTR | in, matches, intersects | -| sfpd.ATTR | Site First Party Data | string | OpenRTB | imp[].ext.context.data.ATTR=VAL OR site.ext.data.ATTR=VAL OR app.ext.data.ATTR=VAL | in, matches, intersects | +| sfpd.ATTR | Site First Party Data | string | OpenRTB | imp[].ext.data.ATTR=VAL OR imp[].ext.context.data.ATTR=VAL OR site.ext.data.ATTR=VAL OR app.ext.data.ATTR=VAL | in, matches, intersects | | segment.SOURCE | User Segment Data | string | OpenRTB | user.data[].id=SOURCE AND VALUE in user.data[].segment[].id | intersects | | bidp.BIDDER.ATTR | Bid Parameter Data | string | OpenRTB | imp[].ext.BIDDER.ATTR | in, matches, intersects| From 07d30795f97f630a06ab72230634d27b6445a2a3 Mon Sep 17 00:00:00 2001 From: Patrick McCann Date: Thu, 20 Oct 2022 20:04:47 -0400 Subject: [PATCH 048/280] Update userId.md (#4098) --- dev-docs/modules/userId.md | 9 +++++---- 1 file changed, 5 insertions(+), 4 deletions(-) diff --git a/dev-docs/modules/userId.md b/dev-docs/modules/userId.md index 96f40052f9..b27fba399a 100644 --- a/dev-docs/modules/userId.md +++ b/dev-docs/modules/userId.md @@ -25,7 +25,7 @@ The User ID module supports multiple ways of establishing pseudonymous IDs for u 1. The publisher builds Prebid.js by specifying one or more ID sub-modules they would like to include. e.g. "gulp build --modules=____IdSystem". You also need to add the `userId` module to your Prebid.js distribution. 1. The page defines User ID configuration in `pbjs.setConfig()` 1. When `setConfig()` is called, and if the user has consented to storing IDs locally, the module is invoked to call the URL if needed - 1. If the relevant local storage is present, the module doesn't call the URL and instead parses the scheme-dependent format, injecting the resulting ID into `bidRequest.userId`. + 1. If the relevant local storage is present or the value of the id is specified in the configuration, the module doesn't call the URL and instead parses the scheme-dependent format, injecting the resulting ID into `bidRequest.userId`. 1. If GDPR applies, the consent signal from the CMP is hashed and stored in a cookie called `_pbjs_userid_consent_data`. This is required so that ID sub-modules may be called to refresh their ID if the user's consent preferences have changed from the previous page, and ensures cached IDs are no longer used if consent is withdrawn. 1. An object containing one or more IDs (`bidRequest.userId`) is made available to Prebid.js adapters and Prebid Server S2S adapters. 1. In addition to `bidRequest.userId`, `bidRequest.userIdAsEids` is made available to Prebid.js adapters and Prebid Server S2S adapters. `bidRequest.userIdAsEids` has userIds in ORTB EIDS format. @@ -38,7 +38,7 @@ Note: If your ID structure is complicated, it is helpful to add tests for pbjs.g Note: To add a custom data type for the response of pbjs.getUserIdsAsEids(), see other examples within the createEidsArray method in /modules/userId/eid.js {: .alert.alert-info :} -Note that User IDs aren't needed in the mobile app world because device ID is available in those ad serving scenarios. +Note that User IDs aren't as popular in the mobile app world because device ID is available in those ad serving scenarios. {: .alert.alert-info :} Note that not all bidder adapters support all forms of user ID. See the tables below for a list of which bidders support which ID schemes. @@ -73,8 +73,9 @@ Publishers that want to do this should design their workflow and then set `_pbjs ## Basic Configuration By including this module and one or more of the sub-modules, a number of new options become available in `setConfig()`, -under the `userSync` object as attributes of the `userIds` array -of sub-objects. +under the `userSync` object as attributes of the `userIds` array of sub-objects. + +The `value` parameter can be used to indicate an identifier the publisher has obtained via a direct integration with that identity provider that the publisher wishes to make available to Prebid.js bidders. Publishers using Google AdManager may want to sync one of the identifiers as their Google PPID for frequency capping or reporting. The PPID in GAM (which is unrelated to the PPID UserId Submodule) has strict rules; refer to [Google AdManager documentation](https://support.google.com/admanager/answer/2880055?hl=en) for them. Please note, Prebid uses a [GPT command](https://developers.google.com/publisher-tag/reference#googletag.PubAdsService) to sync identifiers for publisher convenience. It doesn't currently work for instream video requests, as Prebid typically interacts with the player, which in turn may interact with IMA. IMA does has a [similar method](https://developers.google.com/interactive-media-ads/docs/sdks/html5/client-side/reference/js/google.ima.ImaSdkSettings#setPpid) as GPT, but IMA does not gather this ID from GPT. From f180a22bc134e060f0c41a974e6e763a9edc4fc0 Mon Sep 17 00:00:00 2001 From: rimaburder-index <55195208+rimaburder-index@users.noreply.github.com> Date: Fri, 21 Oct 2022 09:35:50 -0400 Subject: [PATCH 049/280] Split ix doc files between PBJS and PBS (#4090) * Create ix-server * Update ix-server * Update ix-server * Update ix-server * Update ix-server * Update ix-server * Update ix-server * Update ix-server * Update ix-server * Update ix-server * new file to integrate with Index using PBS Created a new file for integration with Index using Prebid Server. We want this to be separate from the PBJS docs. * renamed ix-server to ix-server.md --- dev-docs/bidders/ix-server.md | 293 ++++++++++++++++++++++++++++++++++ 1 file changed, 293 insertions(+) create mode 100644 dev-docs/bidders/ix-server.md diff --git a/dev-docs/bidders/ix-server.md b/dev-docs/bidders/ix-server.md new file mode 100644 index 0000000000..953e44d873 --- /dev/null +++ b/dev-docs/bidders/ix-server.md @@ -0,0 +1,293 @@ +--- +layout: bidder +title: Index Exchange (Prebid Server) +description: Prebid Index Exchange Bidder Adapter +biddercode: ix +pbjs: false +pbs: true +userIds: identityLink, netId, fabrickId, zeotapIdPlus, uid2, unifiedId, id5Id, lotamePanoramaId, publinkId, hadronId, pubcid +pbs_app_supported: true +schain_supported: true +coppa_supported: true +gdpr_supported: true +floors_supported: true +usp_supported: true +media_types: banner, video, native +fpd_supported: true +gvl_id: 10 +dchain_supported: false +deals_supported: true +prebid_member: yes +multiformat_supported: yes +--- + + + +## Table of contents + +- [Introduction](#introduction) +- [Supported media types](#supported-media-types) +- [Set up instructions to call Index through Prebid Server](#call-index) + - [Call Index from a web browser](#call-index-from-a-web-browser) + - [Call Index from Prebid Mobile SDK](#call-index-from-prebid-mobile-sdk) + - [Call Index from CTV/long-form video environment](#call-index-from-ctv-long-form-video-environment) + - [Call Index from any other server-to-server OpenRTB environment](#call-index-from-ortb) +- [Bid request parameters](#bid-request-parameters) +- [Examples](#examples) + + + + +## Introduction + +Publishers can use Prebid Server in any of the following ways with Index Exchange (Index). Index's adapter supports all of the following methods: + +* If you want to call Index from a web environment, you can use Prebid.js to call Prebid Server, and then Prebid Server uses our server-side adapter to call Index. This reduces workload on the browser. For set up instructions, see [Call Index from a web browser](#call-index-from-a-web-browser) section on this page. +* In mobile apps, you can use the Prebid Mobile SDK to call Prebid Server and then Prebid Server uses our server-side adapter to call Index. For set up instructions, see [Call Index from Prebid Mobile SDK](#set-up-instructions-to-call-index-through-prebid-server) section on this page. +* In CTV apps and other long-form video environments, you (or the SSAI vendor) can make a call to Prebid Server using OpenRTB, and then Prebid Server uses our server-side adapter to call Index. For set up instructions, see [Call Index from CTV/long-form video environment](#set-up-instructions-to-call-index-through-prebid-server) section on this page. +* In any other server-to-server OpenRTB environment, you can send OpenRTB bid requests to the Prebid Server host of your choice. For set up instructions, see [Call Index from any other server-to-server OpenRTB environment](#call-index-from-ortb) section on this page. + +**Note about the bid request limit:** You can send up to 20 ad slots in a single bid request to Index. If a single bid request contains more than 20 ad slots, only the first 20 are accepted and the rest are ignored. + + + +## Supported media types + +The following table lists the media types that Index supports. For information about the the Time-To-Live (TTL) for each media type, see [How Index counts impressions](https://kb.indexexchange.com/publishers/billing/how_Index_counts_impressions.htm) in our Knowledge Base. + +{: .table .table-bordered .table-striped } +| Type | Prebid Server support | +| ----------- | ----------- | +| banner | Supported | +| video | Supported, including ad pods for OTT | +| native | Supported | + + +## Setup instructions to call Index through Prebid Server + +**Note:** If you are hosting your own Prebid Server instance, you must contact your Index Exchange Representative to get an endpoint and setup instructions. + +If you are using an existing Prebid Server instance that is already configured to call Index, depending on whether you want to call Index from the browser, mobile app, CTV, or long-form video, follow any of the below sections to complete the Index-specific configuration. + + + + +### Call Index from a web browser + +If you want to call Index from a web environment, you can use Prebid.js to call Prebid Server and then Prebid Server uses our server-side adapter to call Index. For setup instructions, see the Index-specific configuration steps in [Set up instructions for Prebid.js](https://docs.prebid.org/dev-docs/bidders/ix.html) in our Prebid.js documentation on the Prebid site. + + + + +### Call Index from Prebid Mobile SDK + +**Before you begin:** Contact your Index Exchange representative to get your `siteId`. You must provide this site ID to your Prebid Server host company. + +**Note:** To implement Prebid Mobile SDK, follow Prebid's [Getting Started with Prebid Mobile](https://docs.prebid.org/prebid-mobile/prebid-mobile-pbs.html) documentation. + +To add Index as a bidder to your mobile app: + +1. Inform your Prebid Server hosting company to add `ix `as a bidder in the configuration and include the `siteId` that Index provides to you at the time of integration. +2. Define the Index-specific parameters at the bidder level. For information about these parameters, see the [Bid request parameters](#bid-request-parameters) section below. +3. Include any ad unit level required or optional parameters provided in Prebid's [Prebid Mobile API - iOS](https://docs.prebid.org/prebid-mobile/pbm-api/ios/pbm-api-ios.html) and [Prebid Mobile API - Android](https://docs.prebid.org/prebid-mobile/pbm-api/android/pbm-api-android.html) documentation. + + + +### Call Index from CTV/long-form video environment + +**Before you begin:** Contact your Index Exchange Representative to get the `siteId`. You must provide this site ID to your Prebid Server host company. + +**Note:** To implement CTV and long-form video using Prebid Server, follow Prebid's [Long Form Video](https://docs.prebid.org/prebid-server/use-cases/pbs-lfv.html) documentation. + +To add Index as a bidder: + +1. Inform your Prebid Server hosting company to add `ix `as a bidder in the configuration and include the `siteId` that Index provides to you at the time of integration. +2. Define the Index-specific parameters at the bidder level. For information about these parameters, see the [Bid request parameters](#bid-request-parameters) section below. +3. Include any ad unit level required or optional parameters provided in Prebid's [/openrtb2/video](https://docs.prebid.org/prebid-server/endpoints/openrtb2/pbs-endpoint-video.html) documentation. + + + +### Call Index from any other server-to-server OpenRTB environment + +To request bids from Index: + +* In requests that you make to your Prebid Server host, add `imp.ext.ix` and include the `siteId `that Index provides to you at the time of integration.
+**Example:** + +```javascript + "imp": [{ + "ext": { + "ix": { + "siteId": "12345" + } + } + }], +``` + + +
+ +## Bid request parameters + +For a list of the OpenRTB fields that Index supports in bid requests, see [List of supported OpenRTB bid request fields for sellers](https://kb.indexexchange.com/publishers/openrtb_integration/list_of_supported_openrtb_bid_request_fields_for_sellers.htm#List_of_supported_OpenRTB_bid_request_fields_for_sellers). The following are the required fields for the various supported media types. + + +### Banner + +You must include these parameters at the bidder level. + +{: .table .table-bordered .table-striped } +| Key | Scope | Type | Description | +|---|---|---|---| +| `siteId` | Required | String | An Index-specific identifier that is associated with this ad unit. This is similar to a placement ID or an ad unit ID that some other modules have. For example, `'3723'`, `'6482'`, `'3639'`| + +### Video + +You must include these parameters at the bidder level. + + +{: .table .table-bordered .table-striped } +| Key | Scope | Type | Description | +|---|---|---|---| +| `siteId` | Required | String | An Index-specific identifier that is associated with this ad unit. It will be associated with the single size, if the size is provided. This is similar to a placement ID or an ad unit ID that some other modules have. For example, `'3723'`, `'6482'`, `'3639'`
**Note:** You can re-use the existing `siteId` within the same flex position or video size, if the video adapts to the containing `
` element.| + +If you are using Index's outstream player and have placed the video object at the bidder level, you must include the Index required parameters at the bidder level. You can include the optional parameters to specify the outstream player configurations. + + +{: .table .table-bordered .table-striped } +| Key | Scope | Type | Description | +|---|---|---|---| +| `video.w` | Required | Integer | The width of the video player in pixels that will be passed to demand partners. You must define the size of the video player using the `video.w` and `video.h` parameters, with a minimum video player size of `300 x 250`. | +| `video.h` | Required | Integer | The height of the video player in pixels that will be passed to demand partners. You must define the size of the video player using the `video.w` and `video.h` parameters, with a minimum video player size of `300 x 250`. | +| `video.playerSize` | Required | Integer[] | The video player size that will be passed to demand partners. | +| `video.playerConfig` | Optional | Hash | The Index-specific outstream player configurations. | +| `video.playerConfig.floatOnScroll` | Optional | Boolean | A boolean specifying whether you want to use the player's floating capabilities, where:
- `true`: Use the Index player's float capabilities.
**Note:** If you set `floatOnScroll` to `true`, Index updates the placement value to `5`.
**Note:** We do not recommend using the player's default float capabilities if you have more than one outstream ad unit per page.
-`false`: Do not use the Index player's float capabilities (default). | +| `video.playerConfig.floatSize` | Optional | Integer[] | The height and width of the floating player in pixels. If you do not specify a float size, the player adjusts to the aspect ratio of the player size that is defined when it is not floating. Index recommends that you review and test the float size to your user experience preference. | + +
+ +## Examples + +**Banner** + + +```javascript +{ + "id": "ix-banner-id", + "imp": [ + { + "id": "imp-id", + "banner": { + "w": 300, + "h": 250, + "id": "1", + "pos": 0, + "format": [ + { + "w": 300, + "h": 250 + }, + { + "w": 300, + "h": 600 + } + ] + }, + "instl": 0, + "tagid": "5602709", + "bidfloor": 0.02, + "bidfloorcur": "USD", + "secure": 1, + "ext": { + "ix": { + "siteId": "123456" + } + } + } + ], + "app": { + "bundle": "555555555", + "storeurl": "https://apps.apple.com/us/app/test-app/id555555555", + "publisher": { + "id": "123456" + }, + "content": { + "title": "Entertainment", + "genre": "IAB9-30,IAB6,IAB9-7,IAB1" + } + }, + "device": { + "ua": "Mozilla/5.0 (iPhone; CPU iPhone OS 15_6_1 like Mac OS X) AppleWebKit/605.1.15 (KHTML, like Gecko) Mobile/15E148", + "ip": "10.20.30.40", + "ifa": "2E2E2E2E-3B3B-4141-8A8A-181818181818" + }, + "at": 1, + "tmax": 200 +} +``` + + +**Video** + + +```javascript +{ + "id": "ix-video-example", + "imp": [ + { + "id": "imp-id", + "video": { + "mimes": [ + "video/mp4", + "video/3gpp", + "video/webm" + ], + "minduration": 15, + "maxduration": 60, + "startdelay": -1, + "protocols": [ + 2, + 3, + 5, + 6 + ], + "w": 320, + "h": 480, + "placement": 1, + "linearity": 1, + "minbitrate": 1000, + "api": [ + 1, + 2, + 3, + 5 + ] + }, + "secure": 1, + "ext": { + "ix": { + "siteId": "654321" + } + } + } + ], + "app": { + "bundle": "555555555", + "storeurl": "https://apps.apple.com/us/app/test-app/id555555555", + "publisher": { + "id": "123456" + }, + "content": { + "title": "Entertainment", + "genre": "IAB9-30,IAB6,IAB9-7,IAB1" + } + }, + "device": { + "ua": "Mozilla/5.0 (iPhone; CPU iPhone OS 15_6_1 like Mac OS X) AppleWebKit/605.1.15 (KHTML, like Gecko) Mobile/15E18", + "ip": "10.20.30.40", + "ifa": "2E2E2E2E-3B3B-4141-8A8A-181818181818" + }, + "at": 1, + "tmax": 1000 +} +``` From f4c2b99b23b4a850e690022c3651c734a58db74a Mon Sep 17 00:00:00 2001 From: rimaburder-index <55195208+rimaburder-index@users.noreply.github.com> Date: Fri, 21 Oct 2022 09:40:08 -0400 Subject: [PATCH 050/280] ix PBJS/PBS file split - client-side (#4091) * Update ix.md * Update ix.md * Update ix.md * Update ix.md * Update ix.md * Update ix.md * Update ix.md * Update ix.md * Update ix.md * Update ix.md * Update ix.md * Update ix.md * Update ix.md * Update ix.md * Update ix.md * Update ix.md * Update ix.md * updated ix.md Edited the entire file to keep only Prebid.js related integration steps. For PBS related steps, we have a new file for which I have raised a separate PR (https://github.com/prebid/prebid.github.io/pull/4090). * updated links that were broken --- dev-docs/bidders/ix.md | 684 +++++++++++++++++++++-------------------- 1 file changed, 359 insertions(+), 325 deletions(-) diff --git a/dev-docs/bidders/ix.md b/dev-docs/bidders/ix.md index 0f952f0c9e..e9916553ad 100644 --- a/dev-docs/bidders/ix.md +++ b/dev-docs/bidders/ix.md @@ -1,10 +1,10 @@ --- layout: bidder -title: Index Exchange +title: Index Exchange (Prebid.js) description: Prebid Index Exchange Bidder Adapter biddercode: ix pbjs: true -pbs: true +pbs: false userIds: identityLink, netId, fabrickId, zeotapIdPlus, uid2, unifiedId, id5Id, lotamePanoramaId, publinkId, hadronId, pubcid pbs_app_supported: true schain_supported: true @@ -15,159 +15,398 @@ usp_supported: true media_types: banner, video, native fpd_supported: true gvl_id: 10 +dchain_supported: false +deals_supported: true prebid_member: yes +multiformat_supported: yes --- -## Overview +## Table of contents +- [Introduction](#introduction) +- [Supported media types](#supported-media-types) +- [Set up Prebid.js to call Index directly from the browser](#client-side-adapter) +- [Set up Prebid.js to call Index through Prebid Server](#server-side-adapter) +- [Modules to include in your build process](#modules-to-include-in-your-build-process) +- [Set up First Party Data (FPD)](#set-up-first-party-data-fpd) +- [Index's outstream video player](#index-outstream-video-player) +- [Prebid Native configuration](#prebid-native-configuration) +- [Bid request parameters](#bid-request-parameters) +- [Examples](#examples) + + + + +## Introduction + +Publishers can use Prebid.js to call Index Exchange (Index) in any of the following ways: + +* **Call through our client-side adapter:** Prebid.js calls Index directly from the browser using our client-side adapter. This option tends to have a better cookie match rate. For configuration instructions, see the [Set up Prebid.js to call Index directly from the browser (client-side adapter)](#client-side-adapter) on this page. +* **Call through our server-side adapter**: Prebid.js makes a call to Prebid Server and then Prebid Server uses our server-side adapter to call Index. This reduces workload on the browser. For configuration instructions, see the [Set up Prebid.js to call Index through Prebid Server (server-side adapter)](#server-side-adapter) on this page. + +**Notes:** +* **Bid request limit**: You can send up to 20 ad slots in a single bid request to Index. If a single bid request contains more than 20 ad slots, only the first 20 are accepted and the rest are ignored. +* **How to view bid requests sent to Index:** + 1. In your browser, open a new tab. + 2. Open the **Developer tools**. + 3. In **Developer tools**, click the **Network** tab. + 4. In the **Network** tab, search for requests sent to `casalemedia.com/cygnus` (from version 6.28.0 and earlier) or `casalemedia.com/openrtb/pbjs` (from version 6.29.0 and later). These are the bid requests sent to Index. + + + + +## Supported media types + +The following table lists the media types that Index supports. For information about the the Time-To-Live (TTL) for each media type, see [How Index counts impressions](https://kb.indexexchange.com/publishers/billing/how_Index_counts_impressions.htm) in our Knowledge Base. + +{: .table .table-bordered .table-striped } + +| Type | Prebid Server support | +| ----------- | ----------- | +| banner | Supported | +| video | Supported | +| native | Supported | + + + +## Set up Prebid.js to call Index directly from the browser (client-side adapter) + +In this configuration Prebid.js calls Index directly from the browser using our client-side adapter. Follow the quick start instructions provided in Prebid's [Getting Started for Developers](https://docs.prebid.org/dev-docs/getting-started.html) documentation. Complete the following steps to complete the Index-specific configuration: + + +1. Build the binary in one of the following ways: + * [Download Prebid.js](https://docs.prebid.org/download.html) from the Prebid site to use the standard compiled binary that Prebid includes in the download process and select **Index Exchange** as an adapter. + * Build it on your own from the source code by following the instructions in [Prebid.js project README](https://github.com/prebid/Prebid.js/blob/master/README.md#build-optimization). If you use this method, you will need to include several modules in your build process. See the [Index modules to include in your build process](#modules-to-include-in-your-build-process) section below. +2. Define the Index-specific parameters at the bidder level which include adding `ix` as the bidder and the `siteId`. For Index's bidder-specific parameters, see the [Bid request parameters](#bid-request-parameters) section below.
+**Example:** +```javascript +{ + bidder: 'ix', + params: { + siteId: '123456' + } + } ``` -Module Name: Index Exchange Adapter -Module Type: Bidder Adapter -Maintainer: prebid.support@indexexchange.com + +3. Define your ad units in the `adUnit` object. This includes the details about the ad slots such as the media types, ad size, and ad code. For more information about this object, see Prebid's [Ad Unit Reference](https://docs.prebid.org/dev-docs/adunit-reference.html) documentation. +4. Enable user syncing by adding the following code in the [pbjs.setConfig()](https://docs.prebid.org/dev-docs/publisher-api-reference/setConfig.html) function. Index strongly recommends enabling user syncing through iFrames. This functionality improves DSP user match rates and increases the Index bid rate and bid price. Make sure to call `pbjs.setConfig()` only once. This configuration is optional in Prebid, but required by Index.
+**Note:** While we recommend iFrame-based user syncing, we also support image-based user syncing. If both are enabled, we will default to using iFrame, because it allows us more flexibility to optimize the frequency, timing, and coverage for syncing. + +```javascript +pbjs.setConfig({ + userSync: { + iframeEnabled: true, + filterSettings: { + iframe: { + bidders: ['ix'], + filter: 'include' + } + } + } +}); ``` -## Description -Publishers may access Index Exchange's (IX) network of demand sources through our Prebid.js and Prebid Server adapters. Both of these modules are GDPR and CCPA compliant. +5. (Optional) Set up First Party Data (FPD) using the Index bidder-specific FPD (preferred method) setting or the Prebid FPD module. For more information, see the [Set up First Party Data (FPD)](#set-up-first-party-data-fpd) section below. +6. (Optional) If you want to monetize instream video, you need to enable a cache endpoint in the `[pbjs.setConfig()](https://docs.prebid.org/dev-docs/publisher-api-reference/setConfig.html)` function as follows:
+```javascript +pbjs.setConfig({ + cache: { + url: 'https://prebid.adnxs.com/pbc/v1/cache' + } +}); +``` + +7. (Optional) If you want to monetize outstream video, you can choose among the following options. Outstream video is available from Prebid.js version 6.25 or higher. + * Use Index’s outstream video player. For more information, see the [Index's outstream video player ](#indexs-outstream-video-player)section below. + * Use your own outstream video player. For more information, see [Prebid's documentation on how to show video ads.](https://docs.prebid.org/dev-docs/show-outstream-video-ads.html) +8. (Optional) Configure Prebid Native with Index. For more information, see the [Prebid Native](#prebid-native-configuration) section below. Prebid Native is available from Prebid.js version 7.4.0 or higher. + +
+ +## Set up Prebid.js to call Index through Prebid Server (server-side adapter) + +In this configuration, Prebid.js makes a call to Prebid Server and then Prebid Server uses our server-side adapter to call Index. Complete the following steps to complete the Index-specific configuration: + +1. In your PrebidServer adapter configuration Prebid.js, you must enable the Index adapter as follows: +```javascript + adapters.ix.enabled=true + adapters.ix.endpoint=http:// +``` + + +2. In the `[pbjs.setConfig()](https://docs.prebid.org/dev-docs/modules/prebidServer.html)` function, within the s2sConfig property, add `ix` to the bidders attribute. +3. Define the Index-specific parameters at the bidder level. For Index's bidder-specific parameters, see the [Bid request parameters](#bid-request-parameters) section below. +4. Define your ad units in the `adUnit` object. For more information about this object, see Prebid's [Ad Unit Reference](https://docs.prebid.org/dev-docs/adunit-reference.html) documentation. +5. Set a server-side timeout to control the maximum time taken to connect to the server. The timeout value must be a positive whole number in milliseconds. If you do not specify the time, the default value is 50ms. You can specify the `timeout` value in the `[pbjs.setConfig()](https://docs.prebid.org/dev-docs/publisher-api-reference/setConfig.html)` function as follows:
+```javascript +pbjs.setConfig({ + ix: { + timeout: 50 + } +}); +``` + + +6. Enable user syncing by adding the following code in the `[pbjs.setConfig()]` function. Index strongly recommends enabling user syncing through iFrames. This functionality improves DSP user match rates and increases the Index bid rate and bid price. Be sure to call `pbjs.setConfig()` only once. This configuration is optional in Prebid, but required by Index.
+**Note:** While we recommend iFrame-based user syncing, we also support image-based user syncing. If both are enabled, we will default to using iFrame, because it allows us more flexibility to optimize the frequency, timing, and coverage for syncing.
+```javascript +pbjs.setConfig({ + userSync: { + iframeEnabled: true, + filterSettings: { + iframe: { + bidders: ['ix'], + filter: 'include' + } + } + } + }); +``` + + +7. (Optional) Set up First Party Data (FPD) using the Index bidder-specific FPD (preferred method) setting or the Prebid FPD module. For more information, see the [Set up First Party Data (FPD)](#set-up-first-party-data-fpd) section below. +8. (Optional) If you want to monetize instream video, you need to enable a cache endpoint in the `[pbjs.setConfig()]` function as follows: +```javascript +pbjs.setConfig({ + cache: { + url: 'https://prebid.adnxs.com/pbc/v1/cache' + } +}); +``` + + + +9. (Optional) If you want to monetize outstream video, you can choose among the following options. Outstream video is available from Prebid.js version 6.25 or higher. + * Use Index's outstream video player. For more information, see the [Index's outstream video player ](#indexs-outstream-video-player) section below. + * Use your own outstream video player. For more information, see [Prebid’s documentation on how to show video ads.](https://docs.prebid.org/dev-docs/show-outstream-video-ads.html) +10. (Optional) Configure Prebid Native with Index. For more information, see the [Prebid Native](#prebid-native-configuration) section below. Prebid Native is available from Prebid.js version 7.4.0 or higher. -### IX Prebid.js Adapter -This module connects publishers to Index Exchange's (IX) network of demand sources through Prebid.js. This module is GDPR and CCPA compliant. -It is compatible with the new Prebid.js 5.0 ad unit format where banner and video properties, including the size parameter, are stored in the `adUnits[].mediaTypes` object. IX still supports both size as an optional parameter and the Missing Sizes feature, but we recommend upgrading to the Prebid.js 5.0 format. +
-For more information about how the `adUnits[].mediaTypes` object is formatted in Prebid.js 5.0, refer to the following example. +## Modules to include in your build process + +If you are building the JS binary on your own from source code, follow the instructions in [Prebid.js project README](https://github.com/prebid/Prebid.js/blob/master/README.md#build-optimization). You will need to include the `ixBidAdapter`. If you want to show video ads with Google Ad Manager, also include the `dfpAdServerVideo` module. We highly recommend adding the `gptPreAuction` module as well, which improves a DSP's ability to bid accurately on your supply. The following is an example build command that include these modules:
+`gulp build --modules=ixBidAdapter,dfpAdServerVideo,gptPreAuction,fooBidAdapter,bazBidAdapter` + +If you are using a JSON file to specify modules, add `ixBidAdapter` and `dfpAdServerVideo` to the modules array as follows: +```javascript +[ + "ixBidAdapter", + "dfpAdServerVideo", + "gptPreAuction", + "fooBidAdapter", + "bazBidAdapter" +] +``` + + +
+ +## Set up First Party Data (FPD) + +You can set up FPD using the Index bidder-specific module (recommended) or the Prebid FPD module. + +**Notes:** + +* Index does not support ad unit-specific FPD and `ortb2.imp`. +* To target deals with Index, you must use the Index bidder-specific FPD module. The Prebid FPD module does not support deals targeting. If you have any questions or need help setting up the configuration, contact your Index Representative. + + + +### Index bidder-specific FPD module + +This module allows you to specify key-value pairs that will be included in your query string when targeting deals. For example, if a user visits a news page, you can pass that information by submitting a key-value pair for `category = news`. You can then create a deal in the Index UI and activate the deal only on pages that contain `category = news` as the key-value pair. + +To include the FPD in a bid request, in the `[pbjs.setConfig()]` object at the `ix` bidder level, provide the key-values in the `firstPartyData` parameter. Make sure that you set it before the `pbjs.requestBids` configuration. If you want to change the values, you can update the `pbjs.setConfig` once again. The change will be reflected in all future bid requests. + +```javascript + pbjs.setConfig({ + ix: { + firstPartyData: { + '': '', + '': '', + // ... + } + } +}); +``` + + + + +### Prebid FPD module + +This module allows all bid adapters to have access to first party data that might be useful in ad targeting. This is available from Prebid.js version 4.30 and above. +To supply data that is accessible to all bidders, use the `[pbjs.setConfig()](https://docs.prebid.org/dev-docs/publisher-api-reference/setConfig.html)` object as illustrated below. Use the `[setBidderConfig()](https://docs.prebid.org/dev-docs/publisher-api-reference/setBidderConfig.html)` function to supply bidder-specific data. For more information about the standard or more detailed examples, see Prebid's [First Party Data Feature](https://docs.prebid.org/features/firstPartyData.html) documentation. + +```javascript +pbjs.setConfig({ + ortb2: { + site: { + ... + }, + user: { + ... + } + } +}); +``` + + + +## Index's outstream video player + +Publishers who are using Index as a bidding adapter in Prebid.js can show outstream video ads on their site using Index's outstream video player. This allows a video ad to be placed anywhere on a publisher’s site, such as in-article, in-feed, and more. Outstream video is available from Prebid.js version 6.25 or higher.
+**Note:** When you use the Index renderer for outstream video, all impressions are considered viewable, which is similar to how Google's ActiveView counts impressions for outstream. This is because Index renders the outstream video as soon as it is in view and concurrently fires any impression pixels in the VAST. + +To use Index’s outstream video player, in your Prebid.js configuration:
+ +1. Define a new video object in any of the following ways: + * At the `adUnit` level: Define the size using `video.playerSize`. + * At the `bidder` level: Define the size of the video player using the `video.h` and `video.w` parameters.
+**Note:** The `bidder` level video configurations override the `adUnit` level configurations. The `playerConfig` is only a bidder level configuration. +2. Configure the player according to the options in the [Bid request parameters](#bid-request-parameters) section below.
+For more information on how to structure the video object, refer to the following code example:
```javascript var adUnits = [{ - // ... + code: 'div-gpt-ad-1571167646410-1', mediaTypes: { - banner: { - sizes: [ - [300, 250], - [300, 600] - ] - }, video: { - context: 'instream', - playerSize: [300, 250] + playerSize: [640, 360], + context: 'outstream', + api: [2], + protocols: [2, 3, 5, 6], + minduration: 5, + maxduration: 30, + mimes: ['video/mp4', 'application/javascript'], + placement: 5 } }, - // ... -}]; + bids: [{ + bidder: 'ix', + params: { + siteId: '715964' + video: { + playerConfig: { + floatOnScroll: true, + floatSize: [300,250] + } + } + } + }] ``` -### Supported Media Types (Prebid.js) -{: .table .table-bordered .table-striped } -| Type | Support | -|---|---| -| `banner` | Fully supported for all IX approved sizes | -| `video` | Fully supported for all IX approved sizes | -| `native` | Supported | -### Supported Media Types (Prebid Server) +*Please note that your use of the outstream video player will be governed by and subject to the terms and conditions of i) any master services or license agreement entered into by you and Index Exchange; ii) the information provided on our knowledge base linked [here](https://kb.indexexchange.com/publishers/prebid_integration/outstream_video_prebidjs.htm) and [here](https://kb.indexexchange.com/publishers/guidelines/standard_contractual_clauses.htm), and iii) our [Privacy Policy](https://www.indexexchange.com/privacy/). Your use of Index's outstream video player constitutes your acknowledgement and acceptance of the foregoing.* -{: .table .table-bordered .table-striped } -| Type | Support | -|------|-------| -| `banner` | Fully supported | -| `video` | Fully supported, including ad pods for OTT | -| `native` | Supported | +
-# Ad Unit or Bidder Parameters +## Prebid Native configuration -These params can be specified in the ad unit level, which will be the preferred way going forward with PBJS 5.0 +Prebid Native is available from Prebid.js version 7.4.0 or higher. We support the three native template rendering options that are provided in [Setting up Prebid Native in Google Ad Manager](https://docs.prebid.org/adops/gam-native.html). The following code is an example of a Prebid native setup using Google Ad Manager, but the concept and implementation should be similar for other ad servers.
-Each of the IX-specific parameters provided under the object are detailed here. +```javascript +pbjs.addAdUnits({ + code: slot.code, + mediaTypes: { + native: { + image: { + required: true, + sizes: [150, 50] + }, + title: { + required: true, + len: 80 + }, + sponsoredBy: { + required: true + }, + clickUrl: { + required: true + }, + privacyLink: { + required: false + }, + body: { + required: true + len: 90 + }, + icon: { + required: true, + sizes: [50, 50] + } + } + }, + bids: [{ + bidder: 'ix', + params: { + siteId: '715966' + } + }] +}); +``` + + +
-The following parameters are specified in the ad unit `adUnits[].mediaTypes`. This includes each of the IX-specific parameters provided under `adUnits[].bids[].params`. +## Bid request parameters -In Prebid.js versions 5.0 and above, mediaType and sizes are not required to be defined at the ad unit level. +For a list of the OpenRTB fields that Index supports in bid requests, see [List of supported OpenRTB bid request fields for sellers](https://kb.indexexchange.com/publishers/openrtb_integration/list_of_supported_openrtb_bid_request_fields_for_sellers.htm#List_of_supported_OpenRTB_bid_request_fields_for_sellers). The following are the required fields for the various supported media types. -### Banner + +### Banner + +You must include these parameters at the bidder level. {: .table .table-bordered .table-striped } + | Key | Scope | Type | Description | |---|---|---|---| -| `siteId` | Required | String | An IX-specific identifier that is associated with this ad unit. It will be associated to the single size, if the size provided. This is similar to a placement ID or an ad unit ID that some other modules have. For example, `'3723'`, `'6482'`, `'3639'`| -| `sizes` | Optional | Number[Number[]] | The size/sizes associated with the site ID, as listed in the ad unit under `adUnits[].mediaTypes.banner.sizes`. For example, `[300, 250], [300, 600], [728, 90]`| +| `siteId` | Required | String | An Index-specific identifier that is associated with this ad unit. This is similar to a placement ID or an ad unit ID that some other modules have. For example, `'3723'`, `'6482'`, `'3639'`| + +### Video + +You must include these parameters at the bidder level. -### Video {: .table .table-bordered .table-striped } + | Key | Scope | Type | Description | |---|---|---|---| -| `siteId` | Required | String | An IX-specific identifier that is associated with this ad unit. It will be associated to the single size, if the size is provided. This is similar to a placement ID or an ad unit ID that some other modules have. For example, `'3723'`, `'6482'`, `'3639'`| -| `size` | Optional | Number[] | The single size that is associated with the site ID, as listed in the ad unit under `adUnits[].sizes` or `adUnits[].mediaTypes.video.playerSize`. For example, [300, 250], [300, 600].

This parameter is optional in Prebid.js versions 5.0 and above. Versions prior to 5.0 will still require a size parameter.| -| `video` | Optional | Hash | The video object will serve as the properties of the video ad. You can create any field under the video object that is mentioned in the `OpenRTB Spec v2.5`. Some fields like `mimes, protocols, minduration, maxduration` are required. Properties not defined at this level, will be pulled from the Adunit level.| -| `video.w` | Required | Integer | The width of the video player in pixels that will be passed to demand partners.
*If you are using Index’s outstream player and have placed the video object at the `bidder` level, this is a required field. You must define the size of the video player using the `video.w` and `video.h` parameters, with a minimum video player size of 300 x 250.| -| `video.h` | Required | Integer | The height of the video player in pixels that will be passed to demand partners.
*If you are using Index’s outstream player and have placed the video object at the `bidder` level, this is a required field. You must define the size of the video player using the `video.w` and `video.h` parameters, with a minimum video player size of 300 x 250.| -| `video.playerSize` | Optional* | Integer | The video player size that will be passed to demand partners.
*If you are using Index’s outstream player and have placed the video object at the `adUnit` level, this is a required field. You must define the size of the video player using this parameter, with a minimum `video` player size of 300 x 250. | -| `video.mimes` | Required | String[] | If you are using Index’s outstream video player and want to learn more about what is supported, see [List of supported OpenRTB bid request fields for Sellers.](https://kb.indexexchange.com/publishers/openrtb_integration/list_of_supported_openrtb_bid_request_fields_for_sellers.htm#Video) | -| `video.minduration` | Required | Integer | Minimum video ad duration in seconds.| -| `video.maxduration` | Required | Integer | Maximum video ad duration in seconds.| -| `video.protocol` / `video.protocols` | Required | Integer / Integer[] | Either a single protocol provided as an integer, or protocols provided as a list of integers. `2` - VAST 2.0, `3` - VAST 3.0, `5` - VAST 2.0 Wrapper, `6` - VAST 3.0 Wrapper| -| `video.playerConfig` | Optional | Hash | The Index specific outstream player configurations. -| `video.playerConfig.floatOnScroll` | Optional | Boolean | A boolean specifying whether you want to use the player’s floating capabilities, where:
- `true`: Use the Index player’s float capabilities.
**Note**: If you set `floatOnScroll` to `true`, Index updates the `placement` value to `5`.
**Note:** We do not recommend using the player's default float capabilities if you have more than one outstream ad unit per page.
- `false`: Do not use the Index player's float capabilities (default). | -| `video.playerConfig.floatSize` | Optional | Integer[] | The height and width of the floating player in pixels. If you do not specify a float size, the player adjusts to the aspect ratio of the player size that is defined when it is not floating. Index recommends that you review and test the float size to your user experience preference.| +| `siteId` | Required | String | An Index-specific identifier that is associated with this ad unit. It will be associated with the single size, if the size is provided. This is similar to a placement ID or an ad unit ID that some other modules have. For example, `'3723'`, `'6482'`, `'3639'`
**Note:** You can re-use the existing `siteId` within the same flex position or video size, if the video adapts to the containing `
` element.| -### Native -Index supports the native assets that Prebid.js recognizes. For the list of native assets, see [Prebid.js Native Implementation Guide on the Prebid site.](https://docs.prebid.org/prebid/native-implementation.html#3-prebidjs-native-adunit-overview) +If you are using Index's outstream player and have placed the video object at the bidder level, you must include the Index required parameters at the bidder level. You can include the optional parameters to specify the outstream player configurations. -## Setup Guide -Follow these steps to configure and add the IX module to your Prebid.js -integration. +{: .table .table-bordered .table-striped } -The examples in this guide assume the following starting configuration (you may remove banner or video, if either does not apply). +| Key | Scope | Type | Description | +|---|---|---|---| +| `video.w` | Required | Integer | The width of the video player in pixels that will be passed to demand partners. You must define the size of the video player using the `video.w` and `video.h` parameters, with a minimum video player size of `300 x 250`. | +| `video.h` | Required | Integer | The height of the video player in pixels that will be passed to demand partners. You must define the size of the video player using the `video.w` and `video.h` parameters, with a minimum video player size of `300 x 250`. | +| `video.playerSize` | Required | Integer[] | The video player size that will be passed to demand partners. | +| `video.playerConfig` | Optional | Hash | The Index-specific outstream player configurations. | +| `video.playerConfig.floatOnScroll` | Optional | Boolean | A boolean specifying whether you want to use the player's floating capabilities, where:
- `true`: Use the Index player's float capabilities.
**Note:** If you set `floatOnScroll` to `true`, Index updates the placement value to `5`.
**Note:** We do not recommend using the player's default float capabilities if you have more than one outstream ad unit per page.
-`false`: Do not use the Index player's float capabilities (default). | +| `video.playerConfig.floatSize` | Optional | Integer[] | The height and width of the floating player in pixels. If you do not specify a float size, the player adjusts to the aspect ratio of the player size that is defined when it is not floating. Index recommends that you review and test the float size to your user experience preference. | -In regards to video, `context` can either be `'instream'` or `'outstream'`. -```javascript -var adUnits = [{ - code: 'banner-div-a', - mediaTypes: { - banner: { - sizes: [ - [300, 250], - [300, 600] - ] - } - }, - bids: [] -}, -{ - code: 'video-div-a', - mediaTypes: { - video: { - context: 'instream', - playerSize: [1280, 720] - } - }, - bids: [] -}]; -``` +### Native -### 1. Add IX to the appropriate ad units +Index supports the same set of native assets that Prebid.js recognizes. For the list of native assets, see [Prebid.js Native Implementation Guide on the Prebid site.](https://docs.prebid.org/prebid/native-implementation.html#3-prebidjs-native-adunit-overview) -For each size in an ad unit that IX will be bidding on, add one of the following -bid objects under `adUnits[].bids`: -```javascript -{ - bidder: 'ix', - params: { - siteId: '123456' - } -} -``` +
+ +## Examples -Set `params.siteId` in the bid object to the values provided -by your IX representative. -**Examples** +**Banner** + -**Banner:** ```javascript var adUnits = [{ code: 'banner-div-a', @@ -184,21 +423,24 @@ var adUnits = [{ params: { siteId: '123456' } - }, { - bidder: 'ix', - params: { - siteId: '123456' - } + } }] }]; + ``` -**Video (Instream):** + + +**Video (instream):**
+**Note**: `context` can either be `'instream'` or `'outstream'`. + + ```javascript var adUnits = [{ code: 'video-div-a', mediaTypes: { video: { - // Preferred location for openrtb v2.5 compatible video obj + // Preferred location as of version 4.43 + video obj context: 'instream', playerSize: [300, 250], api: [2], @@ -225,21 +467,11 @@ var adUnits = [{ } }] }]; -``` -Please note that you can re-use the existing `siteId` within the same flex -position. - -**Video (Outstream):** -Publishers have two options to receive outstream video demand from Index: -* Using Index’s outstream video player -* In an outstream video configuration set up by the publisher. For more information, see [Prebid’s documentation on how to show video ads.](https://docs.prebid.org/dev-docs/show-outstream-video-ads.html) -**Index’s outstream video player** -Publishers who are using Index as a bidding adapter in Prebid.js can show outstream video ads on their site from us by using Index’s outstream video player. This allows a video ad to display inside of a video player and can be placed anywhere on a publisher’s site, such as in-article, in-feed, and more. +``` -Define a new `video` object for our outstream video player at either the adUnit level or the `bidder` level. If you are setting it at the bidder level, define the size of the video player using the parameters `video.h` and `video.w`. If you are setting it at the `adUnit` level, define the size using `video.playerSize`.
**Note:** The bidder level video configurations override the adunit level configurations. The `playerConfig` is only a bidder level configuration. -For more information on how to structure the `video` object, refer to the following code example: +**Video (outstream)** ```javascript @@ -270,26 +502,14 @@ var adUnits = [{ } }] }]; + ``` -Please note that your use of the outstream video player will be governed by and subject to the terms and conditions of i) any master services or license agreement entered into by you and Index Exchange; ii) the information provided on our knowledge base linked [here](https://kb.indexexchange.com/publishers/prebid_integration/outstream_video_prebidjs.htm) and [here](https://kb.indexexchange.com/publishers/guidelines/standard_contractual_clauses.htm), and iii) our [Privacy Policy](https://www.indexexchange.com/privacy/). Your use of Index’s outstream video player constitutes your acknowledgement and acceptance of the foregoing. -#### Video Caching -Note that the IX adapter expects a client-side Prebid Cache to be enabled for instream video bidding. +**Prebid Native** -``` -pbjs.setConfig({ - usePrebidCache: true, - cache: { - url: 'https://prebid.adnxs.com/pbc/v1/cache' - } -}); -``` -#### Native -We support the three native template rendering options that are provided in the [Setting up Prebid Native in Google Ad Manager](https://docs.prebid.org/adops/gam-native.html). The following code is an example of a Prebid native set up using Google Ad Manager, but the concept and implementation should be similar for other ad servers. - -``` +```javascript pbjs.addAdUnits({ code: slot.code, mediaTypes: { @@ -328,191 +548,5 @@ pbjs.addAdUnits({ } }] }); -``` - -#### User Sync -Add the following code to enable user sync. IX strongly recommends enabling user syncing through iFrames. This functionality improves DSP user match rates and increases the IX bid rate and bid price. Be sure to call `pbjs.setConfig()` only once. -**Note**: While we recommend iframe-based user syncing, we also support image-based user syncing. If both are enabled, we will default to using iframe, because it allows us more flexibility to optimize the frequency, timing, and coverage for syncing. - -``` -pbjs.setConfig({ - userSync: { - iframeEnabled: true, - filterSettings: { - iframe: { - bidders: ['ix'], - filter: 'include' - } - } - } -}); -``` - -#### The **detectMissingSizes** feature -`detectMissingSize` config is now deprecated and IX bidding adapter bids on all banner sizes available in the ad unit when configured to at least one banner size. - -### 2. Include `ixBidAdapter` in your build process - -When running the build command, include `ixBidAdapter` as a module, as well as `dfpAdServerVideo` if you require video support. - -``` -gulp build --modules=ixBidAdapter,dfpAdServerVideo,fooBidAdapter,bazBidAdapter -``` - -If a JSON file is being used to specify the bidder modules, add `"ixBidAdapter"` -to the top-level array in that file. - -```json -[ - "ixBidAdapter", - "dfpAdServerVideo", - "fooBidAdapter", - "bazBidAdapter" -] -``` - -And then build. - -``` -gulp build --modules=bidderModules.json -``` - -## Setting First Party Data (FPD) - -As a part of 4.30, IX will start to pick up FPD in the global FPD module, as well as continue to pick up IX bidder-specific FPD. Previous versions of IX Bid Adapter will only support the IX bidder-specific FPD. - -### Global FPD - -As of Prebid.js 4.30, use the more generic `ortb2` interface, which can be used for more than just First Party Data. - -The First Party Data feature allows publishers to specify key/value data in one place where each compatible bid adapter can read it. - -To supply global data, use the [`setConfig()`](/dev-docs/publisher-api-reference/setConfig.html) function as illustrated below: - -``` -pbjs.setConfig({ - ortb2: { - site: { - ... - }, - user: { - ... - } - } -}); -``` - -Use the [`setBidderConfig()`](/dev-docs/publisher-api-reference/setBidderConfig.html) function to supply bidder-specific data. - -For more information about the standard or more detailed examples, refer to [First Party Data Feature](/features/firstPartyData.html). - -### IX bidder-specific FPD - -FPD allows you to specify key-value pairs that are passed as part of the -query string to IX for use in Private Marketplace Deals which rely on query -string targeting for activation. For example, if a user is viewing a -news-related page, you can pass on that information by sending `category=news`. -Then in the IX Private Marketplace setup screens, you can create Deals which -activate only on pages that contain `category=news`. Please reach out to your -IX representative if you have any questions or need help setting this up. - -To include FPD in a bid request, it must be set before `pbjs.requestBids` is -called. To set it, call `pbjs.setConfig` and provide it with a map of FPD keys -to values as such: - -```javascript -pbjs.setConfig({ - ix: { - firstPartyData: { - '': '', - '': '', - // ... - } - } -}); -``` - -The values can be updated at any time by calling `pbjs.setConfig` again. The -changes will be reflected in any proceeding bid requests. - -{: .alert.alert-warning :} -Continue to use IX bidder-specific First Party Data for IX deals. Global First Party Data is not yet supported in IX deals. Consult your IX representative with any questions. - -## Setting a Server Side Timeout - -Setting a server-side timeout allows you to control the max length of time taken to connect to the server. The default value when unspecified is 50ms. - -This is distinctly different from the global bidder timeout that can be set in -Prebid.js in the browser. - -To add a server-side timeout, it must be set before `pbjs.requestBids` is -called. To set it, call `pbjs.setConfig` and provide it with a timeout value as -such: - -```javascript -pbjs.setConfig({ - ix: { - timeout: 50 - } -}); -``` - -The timeout value must be a positive whole number in milliseconds. -## IX Prebid Server Adapter - -Publishers who would like to retrieve IX demand via a Prebid Server instance can do so by adding IX to the list of bidders for a Prebid Server bid request, with a valid site ID. For example: - -```javascript -"imp": [ - { - "id": "test2", - "banner": { - "format": [ - { - "w": 300, - "h": 600 - } - ] - }, - "ext": { - "ix": { - "siteId": "12345" - } - } - } -] ``` - -### Important Prebid Server Note -Any party operating their own hosted Prebid Server instances must reach out to IX (prebid.support@indexexchange.com) to receive approval and customized setup instructions. Please do not send Prebid Server requests without first contacting us -- you will not receive bid responses. - -## Additional Information - -### Bid Request Limit - -If a single bid request to IX contains more than 20 impression requests (i.e. -more than 20 objects in `bidRequest.imp`), only the first 20 will be accepted, -the rest will be ignored. - -To avoid this situation, ensure that when `pbjs.requestBid` is invoked, that the -number of bid objects (i.e. `adUnits[].bids`) with `adUnits[].bids[].bidder` set -to `'ix'` across all ad units that bids are being requested for does not exceed 20. - -### Time-To-Live (TTL) - -Banner bids from Index have a TTL of 600 seconds while video bids have a TTL of 3 hours, after which time they become invalid.
-**Note:** Index supports the `bid.exp` attribute in the bid response which allows our adapter to specify the maximum number of seconds allowed between the auction and billing notice. In the absence of the `bid.exp` attribute, the TTL provided above applies. - -## FAQs - -#### Why do I have to input size in `adUnits[].bids[].params` for IX when the size is already in the ad unit? - -If you are using Prebid.js version 5.0 and above, the `size` parameter is not a required field. Only the `siteID` is required, and it is stored with the sizes in the ad unit. - -#### How can I view the bid request sent to IX by Prebid.js? - -In your browser of choice, create a new tab and open the developer tools. In -developer tools, select the network tab. Then, navigate to a page where IX is -set up to bid. Now, in the network tab, search for requests to -`casalemedia.com/cygnus`. These are the bid requests. From 4dc349b83395de6c8de6ebd90e18c3643b5e6406 Mon Sep 17 00:00:00 2001 From: nllerandi3lift <75995508+nllerandi3lift@users.noreply.github.com> Date: Fri, 21 Oct 2022 09:47:36 -0400 Subject: [PATCH 051/280] Triplelift: clarify video instructions (#4088) * updates version for outstream * clarifies video instructions --- dev-docs/bidders/triplelift.md | 20 +++++--------------- 1 file changed, 5 insertions(+), 15 deletions(-) diff --git a/dev-docs/bidders/triplelift.md b/dev-docs/bidders/triplelift.md index 0425366f09..9f02ecd241 100644 --- a/dev-docs/bidders/triplelift.md +++ b/dev-docs/bidders/triplelift.md @@ -54,17 +54,15 @@ The Triplelift Prebid Server bidding adapter and user sync endpoint require setu #### Video +Triplelift bid params for video mediaTypes are identical, but be sure to include the appropriate video.placement value to indicate instream/outstream format. Speak with your partner manager about which value to place here based on what formats are enabled. + +See the [Ad Unit Reference](https://docs.prebid.org/dev-docs/adunit-reference.html#adunitmediatypesvideo) for more info. {: .table .table-bordered .table-striped } | Name | Scope | Description | Example | Type | |-----------------|------------------------------|--------------------------------------------------------------------------------------|---------------------------------------------|----------| -| `inventoryCode` | required | TripleLift inventory code for this ad unit (provided to you by your partner manager) | `'pubname_instream_1'` | `string` | -| `video` | required | oRTB video object | `{ mimes: ['video/mp4'], w: 640, h: 480 }` | `object` | -| `video.context` | required | Instream or Outstream (v7.9+ for all Outstream) | `instream` | `string` | -| `video.w` | required | oRTB video object width dimension | `640` | `int` | -| `video.h` | required | oRTB video object height dimension | `480` | `int` | -| `video.placement` | optional | Instream: 1; Outstream: 3, 4, 5. | `3` | `int` | +| `adUnit.mediaTypes.video.placement` | required | Instream: 1; Outstream: 3, 4, 5. | `3` | `int` |
@@ -109,11 +107,7 @@ var videoAdUnit = { bids: [{ bidder: 'triplelift', params: { - inventoryCode: 'pubname_instream1', - video: { - w: 640, - h: 480 - } + inventoryCode: 'pubname_instream1' } }] }; @@ -136,10 +130,6 @@ var videoAdUnit = { bidder: 'triplelift', params: { inventoryCode: 'pubname_outstream', - video: { - w: 640, - h: 480 - } } }] }; From af772217a31e4043012b8ae635c67dce0cd21e53 Mon Sep 17 00:00:00 2001 From: Demetrio Girardi Date: Fri, 21 Oct 2022 06:57:19 -0700 Subject: [PATCH 052/280] PBJS: document `adUnit.bids[].renderer` (#4086) --- dev-docs/adunit-reference.md | 2 ++ dev-docs/show-outstream-video-ads.md | 10 +++++++--- 2 files changed, 9 insertions(+), 3 deletions(-) diff --git a/dev-docs/adunit-reference.md b/dev-docs/adunit-reference.md index 879407b5b7..db51c0a7e3 100644 --- a/dev-docs/adunit-reference.md +++ b/dev-docs/adunit-reference.md @@ -37,6 +37,7 @@ See the table below for the list of properties on the ad unit. For example ad u | `labelAny` | Optional | Array[String] | Used for [conditional ads][conditionalAds]. Works with `sizeConfig` argument to [pbjs.setConfig][configureResponsive]. | | `labelAll` | Optional | Array[String] | Used for [conditional ads][conditionalAds]. Works with `sizeConfig` argument to [pbjs.setConfig][configureResponsive]. | | `ortb2Imp` | Optional | Object | ortb2Imp is used to signal OpenRTB Imp objects at the adUnit grain. Similar to the global ortb2 field used for [global first party data configuration](/dev-docs/publisher-api-reference/setConfig.html#setConfig-fpd), but specific to this adunit. The ortb2Imp object currently supports [first party data](#adUnit-fpd-example) including the [Prebid Ad Slot](/features/pbAdSlot.html) and the [interstitial](#adUnit-interstitial-example) signal. | +| `renderer` | Optional | Object | Custom renderer, typically used for [outstream video](/dev-docs/show-outstream-video-ads.html) | @@ -53,6 +54,7 @@ Note that `bids` is optional only for [Prebid Server stored impressions](/dev-do | `params` | Required | Object | Bid request parameters for a given bidder. For allowed params, see the [bidder param reference]({{site.baseurl}}/dev-docs/bidders.html). | | `labelAny` | Optional | Array[String] | Used for [conditional ads][conditionalAds]. Works with `sizeConfig` argument to [pbjs.setConfig][configureResponsive]. | | `labelAll` | Optional | Array[String] | Used for [conditional ads][conditionalAds]. Works with `sizeConfig` argument to [pbjs.setConfig][configureResponsive]. | +| `renderer` | Optional | Object | Custom renderer. Takes precedence over `adUnit.renderer`, but applies only to this bidder. | diff --git a/dev-docs/show-outstream-video-ads.md b/dev-docs/show-outstream-video-ads.md index 77d9576a31..3e551682fa 100644 --- a/dev-docs/show-outstream-video-ads.md +++ b/dev-docs/show-outstream-video-ads.md @@ -73,9 +73,13 @@ Prebid.js will select the `renderer` used to display the outstream video in the {: .alert.alert-warning :} At this time, since not all demand partners return a renderer with their video bid responses, we recommend that publishers associate a `renderer` with their Prebid video adUnits, if possible. By doing so, any Prebid adapter that supports video will be able to provide demand for a given outstream slot. -Renderers are associated with adUnits in two ways. -Primarily through the `adUnit.renderer` object. But also, especially for multiFormat adUnits, through the specified mediaType `adUnit.mediaTypes.video.renderer`. -This object contains these fields: +Renderers can be attached to adUnits in three ways; Prebid will pick the first that is defined as: + + 1. `adUnit.mediaTypes[type].renderer` (for example, `adUnit.mediaTypes.video.renderer`); + 2. `adUnit.bids[].renderer`; + 3. `adUnit.renderer`. + +A renderer is an object containing these properties: 1. `url` -- Points to a file containing the renderer script. 2. `render` -- A function that tells Prebid.js how to invoke the renderer script. From d300dcc2b3ebb4960fe8639828d3d434a4d8d782 Mon Sep 17 00:00:00 2001 From: Rocco Barbini <46724608+rbarbini-ias@users.noreply.github.com> Date: Fri, 21 Oct 2022 15:59:13 +0200 Subject: [PATCH 053/280] Ias rtd module optional parameters (#4084) * Optional parameters as of October 18, 2022, added * fixed missing closed bracket --- dev-docs/modules/iasRtdProvider.md | 10 ++++++++++ 1 file changed, 10 insertions(+) diff --git a/dev-docs/modules/iasRtdProvider.md b/dev-docs/modules/iasRtdProvider.md index 99dae5c16a..a4c4f08245 100644 --- a/dev-docs/modules/iasRtdProvider.md +++ b/dev-docs/modules/iasRtdProvider.md @@ -42,6 +42,13 @@ Configuration example for using RTD module with the `ias` provider: waitForIt: true, params: { pubId: '1234', + keyMappings: { + 'id': 'ias_id' + }, + pageUrl: 'https://integralads.com/test', + adUnitPath: { + 'one-div-id': '/012345/ad/unit/path' + } } } ] @@ -54,3 +61,6 @@ Parameters details: | Name | Type | Scope | Description | | :------------ | :------------ | :------- | :------- | | pubId | string | required | IAS publisher ID | +| keyMappings | object | optional | map from the default IAS key-value ids to any necessary custom key-value id | +| pageUrl | string | optional | URL of the external page (e.g. when prebid is called from inside an iframe) that IAS needs to classify | +| adUnitPath | object | optional | map from the ad slot ids to their ad unit paths | \ No newline at end of file From 278bf533fc4e1ab1825fb38cbeb8fa776236d090 Mon Sep 17 00:00:00 2001 From: "Adserver.Online" <61009237+adserver-online@users.noreply.github.com> Date: Fri, 21 Oct 2022 17:03:02 +0300 Subject: [PATCH 054/280] Schain support (#4075) Co-authored-by: dev --- dev-docs/bidders/aso.md | 11 ++++++++--- 1 file changed, 8 insertions(+), 3 deletions(-) diff --git a/dev-docs/bidders/aso.md b/dev-docs/bidders/aso.md index 8e4fae6934..7f4f4aa40d 100644 --- a/dev-docs/bidders/aso.md +++ b/dev-docs/bidders/aso.md @@ -11,6 +11,9 @@ deals_supported: false pbjs: true pbs: false floors_supported: true +schain_supported: true +multiformat_supported: will-bid-on-one +userIds: all --- ### Note: @@ -19,9 +22,11 @@ For more information about [Adserver.Online](https://adserver.online), please co ### Bid Params {: .table .table-bordered .table-striped } -| Name | Scope | Description | Example | Type | -|---------------|----------|-----------------------|-----------|-----------| -| `zone` | required | Zone ID | `73815` | `integer` | +| Name | Scope | Description | Example | Type | +|---------------|----------|-------------------------|--------------------------|-----------| +| `zone` | required | Zone ID | `73815` | `Integer` | +| `attr` | optional | Custom targeting params | `{keywords: ["a", "b"]}` | `Object` | +| `server` | optional | Custom bidder endpoint | `https://endpoint.url` | `String` | ### Test Parameters From b41ef8e87ee6ed9b104cab1875b4d2d179457252 Mon Sep 17 00:00:00 2001 From: arthurlataks <1751652+arthurlataks@users.noreply.github.com> Date: Fri, 21 Oct 2022 17:05:17 +0300 Subject: [PATCH 055/280] Bidstack adapter documentation (#4071) --- dev-docs/bidders/bidstack.md | 32 ++++++++++++++++++++++++++++++++ 1 file changed, 32 insertions(+) create mode 100644 dev-docs/bidders/bidstack.md diff --git a/dev-docs/bidders/bidstack.md b/dev-docs/bidders/bidstack.md new file mode 100644 index 0000000000..89b289c960 --- /dev/null +++ b/dev-docs/bidders/bidstack.md @@ -0,0 +1,32 @@ +--- +layout: bidder +title: Bidstack +description: Prebid Bidstack Bidder Adapter +biddercode: bidstack +gdpr_supported: true +gvl_id: 462 +usp_supported: false +coppa_supported: false +schain_supported: true +dchain_supported: false +media_types: video +safeframes_ok: false +deals_supported: false +floors_supported: true +fpd_supported: false +pbjs: false +pbs: true +pbs_app_supported: true +prebid_member: false +--- + +### Registration + +The Bidstack Bidding adapter requires setup before beginning. Please contact us at tech@bidstack.com + +### Bid Params + +{: .table .table-bordered .table-striped } +| Name | Scope | Description | Example | Type | +|---------------|----------|--------------|-----------|----------| +| `publisherId` | required | Publisher ID | `'be224bf2-fd3f-4afb-b6fc-4a97718be2f5'` | `string` | \ No newline at end of file From 0381da91796067741065da5de95dbe527e0c932b Mon Sep 17 00:00:00 2001 From: Adish Rao <30475159+adish1997@users.noreply.github.com> Date: Fri, 21 Oct 2022 19:36:48 +0530 Subject: [PATCH 056/280] added aax client doc (#4067) Co-authored-by: adish --- dev-docs/bidders/aax.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/dev-docs/bidders/aax.md b/dev-docs/bidders/aax.md index 909101d40e..5ba57a45b1 100644 --- a/dev-docs/bidders/aax.md +++ b/dev-docs/bidders/aax.md @@ -8,7 +8,7 @@ media_types: banner,native,video usp_supported: true userIds: britepoolId, criteo, id5Id, identityLink, liveIntentId, netId, parrableId, pubCommonId, unifiedId prebid_member: false -pbjs: false +pbjs: true gvl_id: 720 schain_supported: true floors_supported: true From 3b65f0337ca1f69bc225e697546306328d90197c Mon Sep 17 00:00:00 2001 From: el-chuck Date: Fri, 21 Oct 2022 16:07:10 +0200 Subject: [PATCH 057/280] Adding native ads to Smaato docs (#4064) Co-authored-by: Ruslan Sibgatullin --- dev-docs/bidders/smaato.md | 47 +++++++++++++++++++++++++++++++++++++- 1 file changed, 46 insertions(+), 1 deletion(-) diff --git a/dev-docs/bidders/smaato.md b/dev-docs/bidders/smaato.md index c058c1e91a..217598bfad 100644 --- a/dev-docs/bidders/smaato.md +++ b/dev-docs/bidders/smaato.md @@ -7,7 +7,7 @@ gdpr_supported: true gvl_id: 82 usp_supported: true coppa_supported: true -media_types: banner, video +media_types: banner, video, native userId: criteo, pubCommonId, unifiedId pbjs: true pbs: true @@ -118,6 +118,51 @@ var adUnit = { }] }; ``` + +#### Example Native Ad Unit + +```javascript +var adUnit = { + "code": "native unit", + "mediaTypes": { + native: { + sendTargetingKeys: false, + image: { + required: true, + sizes: [150, 50] + }, + icon: { + required: true, + sizes: [50, 50] + }, + title: { + required: true, + len: 80 + }, + sponsoredBy: { + required: true + }, + body: { + required: true + }, + cta: { + required: false + }, + rating: { + required: false + } + } + }, + "bids": [{ + "bidder": "smaato", + "params": { + "publisherId": "1100012345", + "adspaceId": "11002234" + } + }] +}; +``` + #### Example AdPod (long-form) Video Ad Unit ```javascript From afd93dd02e422d21932a350759e396be513e71a9 Mon Sep 17 00:00:00 2001 From: Tiago Peczenyj Date: Fri, 21 Oct 2022 16:08:05 +0200 Subject: [PATCH 058/280] update weborama RTD module documentation with new option asset id on contextual (#4062) * update weborama RTD module with new option asset id on contextual * Update weboramaRtdProvider.md Fix typo * fix doc --- dev-docs/modules/weboramaRtdProvider.md | 32 +++++++++++++++++++++++++ 1 file changed, 32 insertions(+) diff --git a/dev-docs/modules/weboramaRtdProvider.md b/dev-docs/modules/weboramaRtdProvider.md index ec9752ac35..caafa539f7 100644 --- a/dev-docs/modules/weboramaRtdProvider.md +++ b/dev-docs/modules/weboramaRtdProvider.md @@ -120,6 +120,7 @@ On this section we will explain the `params.weboCtxConf` subconfiguration: | :------------ | :------------ | :------------ |:------------ | | token | String | Security Token provided by Weborama, unique per client | Mandatory | | targetURL | String | Url to be profiled in the contextual api | Optional. Defaults to `document.URL` | +| assetID | Function or String | if provided, we will call the document-profile api using this asset id. |Optional| | setPrebidTargeting|Various|If true, will use the contextual profile to set the prebid (GPT/GAM or AST) targeting of all adunits managed by prebid.js| Optional. Default is `params.setPrebidTargeting` (if any) or `true`.| | sendToBidders|Various|If true, will send the contextual profile to all bidders. If an array, will specify the bidders to send data| Optional. Default is `params.sendToBidders` (if any) or `true`.| | defaultProfile | Object | default value of the profile to be used when there are no response from contextual api (such as timeout)| Optional. Default is `{}` | @@ -394,6 +395,37 @@ pbjs.que.push(function () { }); ``` +An alternative version, using asset id instead of target url on contextual, can be found here: + +```javascript +var pbjs = pbjs || {}; +pbjs.que = pbjs.que || []; + +pbjs.que.push(function () { + pbjs.setConfig({ + debug: true, + realTimeData: { + auctionDelay: 1000, + dataProviders: [{ + name: "weborama", + waitForIt: true, + params: { + weboCtxConf: { + token: "<>", // mandatory + assetID: "datasource:docId", // can be a callback to be executed in runtime and returns the identifier + setPrebidTargeting: true, // override param.setPrebidTargeting. default is true + sendToBidders: true, // override param.sendToBidders. default is true + defaultProfile: { // optional, used if nothing is found + webo_ctx: [ ... ], // contextual segments + webo_ds: [ ...], // data science segments + }, + enabled: true, + }, + ... + }); +}); +``` + Imagine we need to configure the following options using the previous example, we can write the configuration like the one below. ||contextual|wam|lite| From cb74149aa731a98736da2f163d95b47e5bf85bc0 Mon Sep 17 00:00:00 2001 From: Robert Ray Martinez III Date: Fri, 21 Oct 2022 08:09:31 -0600 Subject: [PATCH 059/280] MAgnite Analytics MD (#4056) --- dev-docs/analytics/magnite.md | 38 +++++++++++++++++++++++++++++++++++ 1 file changed, 38 insertions(+) create mode 100644 dev-docs/analytics/magnite.md diff --git a/dev-docs/analytics/magnite.md b/dev-docs/analytics/magnite.md new file mode 100644 index 0000000000..2a809116dc --- /dev/null +++ b/dev-docs/analytics/magnite.md @@ -0,0 +1,38 @@ +--- +layout: analytics +title: Magnite +description: Magnite Prebid Analytics Adapter +modulecode: magnite +gdpr_supported: true +usp_supported: true +coppa_supported: true +prebid_member: true +gvl_id: 52 +enable_download: false +--- + +#### Registration + +The Magnite analytics adapter requires setup and approval from the +Magnite team, even for existing accounts. Please reach out to your account +team or globalsupport@magnite.com for more information. + +#### Analytics Options + +{: .table .table-bordered .table-striped } +| Name | Scope | Description | Example | Type | +|-------------|---------|--------------------|-----------------------------------------------------------------------------------------------------------------------------|-------------------------------------------------------------------------------------|------------------| +| accountId | required | The Magnite publisher account ID | `'1001'` | string | +| endpoint | required | The URL where analytics data is sent | `'https://example.rp.com'` | string | + +### Example Configuration + +``` + pbjs.enableAnalytics({ + provider: 'magnite', + options: { + accountId: MAGNITE-ACCOUNT-ID, + endpoint: 'OBTAIN-FROM-MAGNITE' + } + }); +``` From 0c17c015703039620ce83994676dfaeefa58f89d Mon Sep 17 00:00:00 2001 From: Sacha <35510349+thebraveio@users.noreply.github.com> Date: Fri, 21 Oct 2022 17:15:24 +0300 Subject: [PATCH 060/280] added support VideoHeroes prebid server adater (#4040) --- dev-docs/bidders/videoheroes.md | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/dev-docs/bidders/videoheroes.md b/dev-docs/bidders/videoheroes.md index a593804c6d..f9c2d43ba4 100644 --- a/dev-docs/bidders/videoheroes.md +++ b/dev-docs/bidders/videoheroes.md @@ -11,7 +11,9 @@ media_types: banner, video, native safeframes_ok: true bidder_supports_deals: true pbjs: true -pbs: false +pbs: true +floors_supported: true +pbs_app_supported: true --- ### Note: @@ -20,7 +22,6 @@ The VideoHeroes Header Bidding adapter requires setup and approval from the Vide ### Bid Params -{: .table .table-bordered .table-striped } | Name | Scope | Description | Example | Type | |---------------|----------|-----------------------------------|-------------------------------------|-----------| | `placementId` | required | VideoHeroes platform placement id | `1a8d9c22db19906cb8a5fd4518d05f62` | `string` | From c2b69524dcd0e7415bd460c5c1679fe0510625c3 Mon Sep 17 00:00:00 2001 From: bretg Date: Fri, 21 Oct 2022 17:03:45 -0400 Subject: [PATCH 061/280] Update pbs-endpoint-status.md (#4102) --- prebid-server/endpoints/pbs-endpoint-status.md | 2 ++ 1 file changed, 2 insertions(+) diff --git a/prebid-server/endpoints/pbs-endpoint-status.md b/prebid-server/endpoints/pbs-endpoint-status.md index 0d8fd5ce67..824c456612 100644 --- a/prebid-server/endpoints/pbs-endpoint-status.md +++ b/prebid-server/endpoints/pbs-endpoint-status.md @@ -16,3 +16,5 @@ config option. For eample, in `pbs.yaml`: ```yaml status_response: "ok" ``` + +NOTE: this endpoint cannot currently be relied upon to return the same results for different PBS host companies. The results are configurable so that host companies can integrate their servers into their existing monitoring services. From 845066d522fc7a55ef1d666a840db0e0ea259cfe Mon Sep 17 00:00:00 2001 From: bretg Date: Wed, 26 Oct 2022 14:26:21 -0400 Subject: [PATCH 062/280] Update pbs-endpoint-status.md (#4107) --- prebid-server/endpoints/pbs-endpoint-status.md | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/prebid-server/endpoints/pbs-endpoint-status.md b/prebid-server/endpoints/pbs-endpoint-status.md index 824c456612..892299925b 100644 --- a/prebid-server/endpoints/pbs-endpoint-status.md +++ b/prebid-server/endpoints/pbs-endpoint-status.md @@ -9,7 +9,7 @@ title: Prebid Server | Endpoints | /status ## GET /status -This endpoint will return a 2xx response whenever Prebid Server is ready to serve requests. +This endpoint will return an HTTP 200 response whenever Prebid Server is ready to serve requests. Its exact response can be configured with the `status_response` config option. For eample, in `pbs.yaml`: @@ -17,4 +17,5 @@ config option. For eample, in `pbs.yaml`: status_response: "ok" ``` -NOTE: this endpoint cannot currently be relied upon to return the same results for different PBS host companies. The results are configurable so that host companies can integrate their servers into their existing monitoring services. +NOTE: this endpoint cannot be relied upon to return the same results for different PBS host companies. The results are configurable so that host companies can integrate their servers into their existing monitoring services. +If you're building a system that verifies arbitrary Prebid Servers, you should check the HTTP return code. From ec9f90a57a331b13bdbe24a0586fa2b4101adb3f Mon Sep 17 00:00:00 2001 From: bretg Date: Thu, 27 Oct 2022 01:52:03 -0400 Subject: [PATCH 063/280] rubicon clarifying arrays of strings (#4110) --- dev-docs/bidders/rubicon.md | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/dev-docs/bidders/rubicon.md b/dev-docs/bidders/rubicon.md index 10d7d79862..d38ac3d086 100644 --- a/dev-docs/bidders/rubicon.md +++ b/dev-docs/bidders/rubicon.md @@ -41,9 +41,9 @@ For both Prebid.js and Prebid Server, the Rubicon Project adapter requires setup | `userId` | optional | Site-specific user ID may be reflected back in creatives for analysis. Note that userId needs to be the same for all slots. | `'12345abc'` | `string` | | `floor` | optional | Sets the global floor -- no bids will be made under this value. | `0.50` | `float` | | `latLong` | optional | Sets the latitude and longitude for the visitor (avail since PBJS 1.10) | `[40.7608, 111.8910]` | `Array` | -| `inventory` | optional | See below for details on First Party Data. In release 4.29 and earlier, this parameter allows the definition of an object defining arbitrary key-value pairs concerning the page for use in targeting. The values must be arrays. | `{"rating":["5-star"], "prodtype":["tech","mobile"]}` | `object` | -| `visitor` | optional | See below for details on First Party Data. In release 4.29 and earlier, this parameter allows the definition of an object defining arbitrary key-value pairs concerning the visitor for use in targeting. The values must be arrays. | `{"ucat":["new"], "search":["iphone"]}` | `object` | -| `keywords` | optional | See below for details on First Party Data. In release 4.29 and earlier, this can be used to influence reports for client-side display. To get video or server-side reporting, please use First Party data or the inventory/visitor parameters. | `['travel', 'tourism']` | `Array` | +| `inventory` | optional | See below for details on First Party Data. In release 4.29 and earlier, this parameter allows the definition of an object defining arbitrary key-value pairs concerning the page for use in targeting. The values must be arrays of strings. | `{"rating":["5-star"], "prodtype":["tech","mobile"]}` | `object` | +| `visitor` | optional | See below for details on First Party Data. In release 4.29 and earlier, this parameter allows the definition of an object defining arbitrary key-value pairs concerning the visitor for use in targeting. The values must be arrays of strings. | `{"ucat":["new"], "search":["iphone"]}` | `object` | +| `keywords` | optional | See below for details on First Party Data. In release 4.29 and earlier, this can be used to influence reports for client-side display. To get video or server-side reporting, please use First Party data or the inventory/visitor parameters. | `["travel", "tourism"]` | `Array` | | `video` | required for video | Video targeting parameters. See the [video section below](#rubicon-video). | `{"language": "en"}` | `object` | #### First Party Data From 531311a7921f19e1fa272cc589286c58e43b6770 Mon Sep 17 00:00:00 2001 From: Kylian Deau <89531203+github-kylian-deau@users.noreply.github.com> Date: Thu, 27 Oct 2022 09:50:13 +0200 Subject: [PATCH 064/280] teads adapter: Create note to avoid 7.20.0 and 7.21.0 when downloading Prebid.js (#4106) --- dev-docs/bidders/teads.md | 1 + download.md | 2 +- 2 files changed, 2 insertions(+), 1 deletion(-) diff --git a/dev-docs/bidders/teads.md b/dev-docs/bidders/teads.md index ade63899ad..bc78d28afa 100644 --- a/dev-docs/bidders/teads.md +++ b/dev-docs/bidders/teads.md @@ -3,6 +3,7 @@ layout: bidder title: Teads description: Prebid Teads Bidder Adapter pbjs: true +pbjs_version_notes: please avoid using v7.20.0 and v7.21.0 biddercode: teads gdpr_supported: true usp_supported: true diff --git a/download.md b/download.md index 50ede08d8c..a738bcf1f9 100644 --- a/download.md +++ b/download.md @@ -344,7 +344,7 @@ These modules may require accounts with a service provider.
- +
From 084c4ba15dcc00be5bdc56387e09c522f816e36d Mon Sep 17 00:00:00 2001 From: Veronika Solovei Date: Thu, 27 Oct 2022 00:51:06 -0700 Subject: [PATCH 065/280] Update to prebid openRTB fork (#4109) Co-authored-by: vsolovei --- prebid-server/developers/add-new-bidder-go.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/prebid-server/developers/add-new-bidder-go.md b/prebid-server/developers/add-new-bidder-go.md index 221ef4e80e..fb72e529a6 100644 --- a/prebid-server/developers/add-new-bidder-go.md +++ b/prebid-server/developers/add-new-bidder-go.md @@ -456,7 +456,7 @@ import ( "fmt" "net/http" - "github.com/mxmCherry/openrtb/v15/openrtb2" + "github.com/prebid/openrtb/v17/openrtb2" "github.com/prebid/prebid-server/adapters" "github.com/prebid/prebid-server/config" "github.com/prebid/prebid-server/errortypes" From 0c25e26070e5e389f45ce7397ddff538ccfb7888 Mon Sep 17 00:00:00 2001 From: Patrick McCann Date: Thu, 27 Oct 2022 04:47:56 -0400 Subject: [PATCH 066/280] New Example: Sync imp.ext.tid with 'anotherLibrary' (#4104) * Create sync-tid.md * Add example to examples sidebar Co-authored-by: Nepomuk Seiler --- _data/sidebar.yml | 9 +++++++++ dev-docs/examples/sync-tid.md | 17 +++++++++++++++++ 2 files changed, 26 insertions(+) create mode 100644 dev-docs/examples/sync-tid.md diff --git a/_data/sidebar.yml b/_data/sidebar.yml index 0854b2e699..4d23c24d5c 100644 --- a/_data/sidebar.yml +++ b/_data/sidebar.yml @@ -260,6 +260,15 @@ sectionTitle: subgroup: 1 +- sbSecId: 1 + title: Synchronize Transaction Ids With Another Library + link: /dev-docs/examples/sync-tid.html + Item: 1 + isHeader: 0 + isSectionHeader: 0 + sectionTitle: + subgroup: 1 + - sbSecId: 1 title: Troubleshooting link: diff --git a/dev-docs/examples/sync-tid.md b/dev-docs/examples/sync-tid.md new file mode 100644 index 0000000000..79a4cee49a --- /dev/null +++ b/dev-docs/examples/sync-tid.md @@ -0,0 +1,17 @@ +--- +layout: example +title: Sync Transaction Ids With Another Library +description: Synchronize Transaction Ids With Another Library +sidebarType: 1 + + + +about: +- imp.ext.tid sync +- This example demonstrates sending the same impression transaction identifier (imp.ext.tid) to two on page libraries + +jsfiddle_link: https://jsfiddle.net/50aqtrck/1/embedded/html,result + +code_height: 2400 + +--- From 0e87636082abccb9beafdca51762967498d06ed9 Mon Sep 17 00:00:00 2001 From: rimaburder-index <55195208+rimaburder-index@users.noreply.github.com> Date: Thu, 27 Oct 2022 07:49:27 -0400 Subject: [PATCH 067/280] Updated the step numbers in ix.md. (#4101) * Updated the step numbers in ix.md. Formatting updates, no change to content. * fixed broken links in ix.md A few links were broken, fixed them. * Updated user sync and timeout info Updated the wording for user sync and removed the timeout step which had an incorrect example --- dev-docs/bidders/ix.md | 36 +++++++++++++----------------------- 1 file changed, 13 insertions(+), 23 deletions(-) diff --git a/dev-docs/bidders/ix.md b/dev-docs/bidders/ix.md index e9916553ad..8d973166d2 100644 --- a/dev-docs/bidders/ix.md +++ b/dev-docs/bidders/ix.md @@ -47,10 +47,10 @@ Publishers can use Prebid.js to call Index Exchange (Index) in any of the follow **Notes:** * **Bid request limit**: You can send up to 20 ad slots in a single bid request to Index. If a single bid request contains more than 20 ad slots, only the first 20 are accepted and the rest are ignored. * **How to view bid requests sent to Index:** - 1. In your browser, open a new tab. - 2. Open the **Developer tools**. - 3. In **Developer tools**, click the **Network** tab. - 4. In the **Network** tab, search for requests sent to `casalemedia.com/cygnus` (from version 6.28.0 and earlier) or `casalemedia.com/openrtb/pbjs` (from version 6.29.0 and later). These are the bid requests sent to Index. + * In your browser, open a new tab. + * Open the **Developer tools**. + * In **Developer tools**, click the **Network** tab. + * In the **Network** tab, search for requests sent to `casalemedia.com/cygnus` (from version 6.28.0 and earlier) or `casalemedia.com/openrtb/pbjs` (from version 6.29.0 and later). These are the bid requests sent to Index. @@ -89,9 +89,9 @@ In this configuration Prebid.js calls Index directly from the browser using our ``` 3. Define your ad units in the `adUnit` object. This includes the details about the ad slots such as the media types, ad size, and ad code. For more information about this object, see Prebid's [Ad Unit Reference](https://docs.prebid.org/dev-docs/adunit-reference.html) documentation. -4. Enable user syncing by adding the following code in the [pbjs.setConfig()](https://docs.prebid.org/dev-docs/publisher-api-reference/setConfig.html) function. Index strongly recommends enabling user syncing through iFrames. This functionality improves DSP user match rates and increases the Index bid rate and bid price. Make sure to call `pbjs.setConfig()` only once. This configuration is optional in Prebid, but required by Index.
-**Note:** While we recommend iFrame-based user syncing, we also support image-based user syncing. If both are enabled, we will default to using iFrame, because it allows us more flexibility to optimize the frequency, timing, and coverage for syncing. +4. Enable user syncing by adding the following code in the [pbjs.setConfig()](https://docs.prebid.org/dev-docs/publisher-api-reference/setConfig.html) function. Index strongly recommends enabling user syncing through iFrames, though we do also support image-based syncing. This functionality improves DSP user match rates and increases the Index bid rate and bid price. Make sure to call `pbjs.setConfig()` only once. This configuration is optional in Prebid, but required by Index.
+**Example:** ```javascript pbjs.setConfig({ userSync: { @@ -135,21 +135,11 @@ In this configuration, Prebid.js makes a call to Prebid Server and then Prebid S ``` -2. In the `[pbjs.setConfig()](https://docs.prebid.org/dev-docs/modules/prebidServer.html)` function, within the s2sConfig property, add `ix` to the bidders attribute. +2. In the `[pbjs.setConfig()]` function, within the `s2sConfig` property, add `ix` to the `bidders` attribute. 3. Define the Index-specific parameters at the bidder level. For Index's bidder-specific parameters, see the [Bid request parameters](#bid-request-parameters) section below. 4. Define your ad units in the `adUnit` object. For more information about this object, see Prebid's [Ad Unit Reference](https://docs.prebid.org/dev-docs/adunit-reference.html) documentation. -5. Set a server-side timeout to control the maximum time taken to connect to the server. The timeout value must be a positive whole number in milliseconds. If you do not specify the time, the default value is 50ms. You can specify the `timeout` value in the `[pbjs.setConfig()](https://docs.prebid.org/dev-docs/publisher-api-reference/setConfig.html)` function as follows:
-```javascript -pbjs.setConfig({ - ix: { - timeout: 50 - } -}); -``` - +5. Enable user syncing by adding the following code in the [pbjs.setConfig()](https://docs.prebid.org/dev-docs/publisher-api-reference/setConfig.html) function. Index strongly recommends enabling user syncing through iFrames, though we do also support image-based syncing. This functionality improves DSP user match rates and increases the Index bid rate and bid price. Be sure to call `pbjs.setConfig()` only once. This configuration is optional in Prebid, but required by Index.
-6. Enable user syncing by adding the following code in the `[pbjs.setConfig()]` function. Index strongly recommends enabling user syncing through iFrames. This functionality improves DSP user match rates and increases the Index bid rate and bid price. Be sure to call `pbjs.setConfig()` only once. This configuration is optional in Prebid, but required by Index.
-**Note:** While we recommend iFrame-based user syncing, we also support image-based user syncing. If both are enabled, we will default to using iFrame, because it allows us more flexibility to optimize the frequency, timing, and coverage for syncing.
```javascript pbjs.setConfig({ userSync: { @@ -165,8 +155,8 @@ pbjs.setConfig({ ``` -7. (Optional) Set up First Party Data (FPD) using the Index bidder-specific FPD (preferred method) setting or the Prebid FPD module. For more information, see the [Set up First Party Data (FPD)](#set-up-first-party-data-fpd) section below. -8. (Optional) If you want to monetize instream video, you need to enable a cache endpoint in the `[pbjs.setConfig()]` function as follows: +6. (Optional) Set up First Party Data (FPD) using the Index bidder-specific FPD (preferred method) setting or the Prebid FPD module. For more information, see the [Set up First Party Data (FPD)](#set-up-first-party-data-fpd) section below. +7. (Optional) If you want to monetize instream video, you need to enable a cache endpoint in the `[pbjs.setConfig()]` function as follows: ```javascript pbjs.setConfig({ cache: { @@ -177,10 +167,10 @@ pbjs.setConfig({ -9. (Optional) If you want to monetize outstream video, you can choose among the following options. Outstream video is available from Prebid.js version 6.25 or higher. +8. (Optional) If you want to monetize outstream video, you can choose among the following options. Outstream video is available from Prebid.js version 6.25 or higher. * Use Index's outstream video player. For more information, see the [Index's outstream video player ](#indexs-outstream-video-player) section below. * Use your own outstream video player. For more information, see [Prebid’s documentation on how to show video ads.](https://docs.prebid.org/dev-docs/show-outstream-video-ads.html) -10. (Optional) Configure Prebid Native with Index. For more information, see the [Prebid Native](#prebid-native-configuration) section below. Prebid Native is available from Prebid.js version 7.4.0 or higher. +9. (Optional) Configure Prebid Native with Index. For more information, see the [Prebid Native](#prebid-native-configuration) section below. Prebid Native is available from Prebid.js version 7.4.0 or higher. @@ -240,7 +230,7 @@ To include the FPD in a bid request, in the `[pbjs.setConfig()]` object at the ` ### Prebid FPD module This module allows all bid adapters to have access to first party data that might be useful in ad targeting. This is available from Prebid.js version 4.30 and above. -To supply data that is accessible to all bidders, use the `[pbjs.setConfig()](https://docs.prebid.org/dev-docs/publisher-api-reference/setConfig.html)` object as illustrated below. Use the `[setBidderConfig()](https://docs.prebid.org/dev-docs/publisher-api-reference/setBidderConfig.html)` function to supply bidder-specific data. For more information about the standard or more detailed examples, see Prebid's [First Party Data Feature](https://docs.prebid.org/features/firstPartyData.html) documentation. +To supply data that is accessible to all bidders, use the `[pbjs.setConfig()]` object as illustrated below. Use the `[setBidderConfig()]` function to supply bidder-specific data. For more information about the standard or more detailed examples, see Prebid's [First Party Data Feature](https://docs.prebid.org/features/firstPartyData.html) documentation. ```javascript pbjs.setConfig({ From 8b0f4c98bcc8361e42908413355b32ca6ea00973 Mon Sep 17 00:00:00 2001 From: Andrew Date: Thu, 27 Oct 2022 07:45:47 -0700 Subject: [PATCH 068/280] Docs outstream improvements (#4041) * Remove outdated outstream examples * Add page for basic ima outstream example * Clean up old comment * Finish working IMA example Co-authored-by: Andrew Fowler --- _data/sidebar.yml | 16 +- _includes/video/pb-os-basic-ima.html | 8 + _includes/video/pb-os-rd.html | 14 -- _layouts/video_sample.html | 2 + examples/video/outstream/basic-ima.html | 143 ++++++++++++ .../video/outstream/pb-ve-outstream-app.html | 203 ----------------- .../outstream/pb-ve-outstream-radiant.html | 215 ------------------ 7 files changed, 157 insertions(+), 444 deletions(-) create mode 100644 _includes/video/pb-os-basic-ima.html delete mode 100644 _includes/video/pb-os-rd.html create mode 100644 examples/video/outstream/basic-ima.html delete mode 100644 examples/video/outstream/pb-ve-outstream-app.html delete mode 100644 examples/video/outstream/pb-ve-outstream-radiant.html diff --git a/_data/sidebar.yml b/_data/sidebar.yml index 4d23c24d5c..cdf76070c1 100644 --- a/_data/sidebar.yml +++ b/_data/sidebar.yml @@ -1716,24 +1716,16 @@ subgroup: 1 - sbSecId: 4 - title: 'Google Ad Manager' - link: /examples/video/outstream/pb-ve-outstream-dfp.html - isHeader: 0 - isSectionHeader: 0 - sectionTitle: - subgroup: 1 - -- sbSecId: 4 - title: 'Radiant' - link: /examples/video/outstream/pb-ve-outstream-radiant.html + title: 'Basic IMA' + link: /examples/video/outstream/basic-ima.html isHeader: 0 isSectionHeader: 0 sectionTitle: subgroup: 1 - sbSecId: 4 - title: 'AdPlayer.Pro' - link: /examples/video/outstream/pb-ve-outstream-app.html + title: 'Google Ad Manager' + link: /examples/video/outstream/pb-ve-outstream-dfp.html isHeader: 0 isSectionHeader: 0 sectionTitle: diff --git a/_includes/video/pb-os-basic-ima.html b/_includes/video/pb-os-basic-ima.html new file mode 100644 index 0000000000..6f3d311902 --- /dev/null +++ b/_includes/video/pb-os-basic-ima.html @@ -0,0 +1,8 @@ + + + + {% include head--common.html %} + + + + diff --git a/_includes/video/pb-os-rd.html b/_includes/video/pb-os-rd.html deleted file mode 100644 index ad413f9ce8..0000000000 --- a/_includes/video/pb-os-rd.html +++ /dev/null @@ -1,14 +0,0 @@ - - - - -{% include head--common.html %} - - - - - - - - - diff --git a/_layouts/video_sample.html b/_layouts/video_sample.html index 47b83f76fc..d2cf058f25 100644 --- a/_layouts/video_sample.html +++ b/_layouts/video_sample.html @@ -46,6 +46,8 @@ {% include /video/pb-os-nas.html %} {% elsif page.videoType == "pb-os-nas-renderer" %} {% include /video/pb-os-nas-renderer.html %} +{% elsif page.videoType == "pb-os-basic-ima" %} + {% include /video/pb-os-basic-ima.html %} {% elsif page.videoType == "pb-lf-fw" %} {% include /video/pb-lf-fw.html %} {% elsif page.videoType == "pb-cp-fp" %} diff --git a/examples/video/outstream/basic-ima.html b/examples/video/outstream/basic-ima.html new file mode 100644 index 0000000000..df6b7ff99d --- /dev/null +++ b/examples/video/outstream/basic-ima.html @@ -0,0 +1,143 @@ +--- +layout: video_sample +title: Prebid Video | Video Outstream Basic Example with Google IMA SDK +description: An example of an outstream video ad using Prebid.js and the Google IMA SDK. +videoType: pb-os-basic-ima +isVideo: true +sidebarType: 4 +code_height: 2300 +--- + + +
+
+
+

{{ page.title }}

+

{{ page.description }}

+
+ + +
+

Important: + This example uses a test version of Prebid.js hosted on our CDN that is not recommended for production use. It includes all available adapters. Production implementations should build from source or customize the build using the Download page to make sure only the necessary bidder adapters are included.

+
+ + +
+

Warning: + Do not forget to exchange the placementId in the code examples with your own placementId!

+
+ +
+ +
+
+ +
+
+

+           
+
+
+
+ + + + diff --git a/examples/video/outstream/pb-ve-outstream-app.html b/examples/video/outstream/pb-ve-outstream-app.html deleted file mode 100644 index 5ec845a426..0000000000 --- a/examples/video/outstream/pb-ve-outstream-app.html +++ /dev/null @@ -1,203 +0,0 @@ ---- -layout: video_sample -title: Prebid Video | Outstream Example with AdPlayer.Pro Player -description: An example of an outstream video using Prebid.js and AdPlayer.Pro player. -videoType: pb-os-app -isVideo: true -sidebarType: 4 ---- - -
-
-
-

{{ page.title }}

-

{{page.description }}

-
- - -
-

Important: - This example uses a test version of Prebid.js hosted on our CDN that is not recommended for production use. It includes all available adapters. Production implementations should build from source or customize the build using the Download page to make sure only the necessary bidder adapters are included.

-
- -
- -
-

Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum.

-
- - -
- -
-

Sed ut perspiciatis unde omnis iste natus error sit voluptatem accusantium doloremque laudantium, totam rem aperiam, eaque ipsa quae ab illo inventore veritatis et quasi architecto beatae vitae dicta sunt explicabo. Nemo enim ipsam voluptatem quia voluptas sit aspernatur aut odit aut fugit, sed quia consequuntur magni dolores eos qui ratione voluptatem sequi nesciunt. Neque porro quisquam est, qui dolorem ipsum quia dolor sit amet, consectetur, adipisci velit, sed quia non numquam eius modi tempora incidunt ut labore et dolore magnam aliquam quaerat voluptatem. Ut enim ad minima veniam, quis nostrum exercitationem ullam corporis suscipit laboriosam, nisi ut aliquid ex ea commodi consequatur? Quis autem vel eum iure reprehenderit qui in ea voluptate velit esse quam nihil molestiae consequatur, vel illum qui dolorem eum fugiat quo voluptas nulla pariatur?

-
-
- - - - - -
-

Warning: - Do not forget to exchange the placementId in the code examples with your own placementId!

-
- -

Place this code in the page header.

-
-
-<script src="//cdn.jsdelivr.net/npm/prebid.js@latest/dist/not-for-prod/prebid.js"></script>
-<!--AdPlayer.Pro code-->
-<script src="https://static.adplayer.pro/player/demo.js"></script>
-      
-
- -

Place this code in the page body.

-
- -
-
-<div id='playerContainerADP'></div>
-<script>
-  /* our app where we run player
-   our app variables */
-    var pbjs;
-    pbjs = pbjs || {};
-    pbjs.que = pbjs.que || [];
-    var debug = false;
-    if (typeof window.console === 'undefined' || typeof window.console.log === 'undefined' || typeof window.console.dir === 'undefined') {
-      debug = false;
-    }
-    var videoId = 'video1';
-
-    /* Prebid video ad unit
-       This is a working example but you must use your own settings/bidders for production
-       More docs at https://prebid.org/prebid-video/video-overview.html */
-    var adUnits = [{
-      code: videoId,
-      mediaTypes: {
-        video: {
-          context: 'outstream',
-                      playerSize: [640, 480],
-                      mimes: ['video/mp4'],
-                      protocols: [1, 2, 3, 4, 5, 6, 7, 8],
-                      playbackmethod: [2],
-                      skip: 1
-        }
-      },
-      bids: [{
-        bidder: 'appnexus',
-        params: {
-          placementId: 13232385
-        }
-      }]
-    }];
-
-    pbjs.que.push(function () {
-      pbjs.addAdUnits(adUnits);
-      pbjs.requestBids({
-        timeout: 1000,
-        bidsBackHandler: function (bids) {
-          if (debug) {
-            window.console.dir(bids);
-          }
-          // we get the VAST XML from bids adResponse and pass it to our outstream player
- if (bids && bids[videoId] && bids[videoId].bids && bids[videoId].bids[0] && bids[videoId].bids[0].adResponse) { - var adResponse = bids[videoId].bids[0].adResponse; - if (adResponse.ad && adResponse.ad.video && typeof adResponse.ad.video.content === 'string') { - var vastXml = bids[videoId].bids[0].adResponse.ad.video.content; - if (vastXml !== '') { - if (debug) { - window.console.log(vastXml); - } - AdPlayerPro('playerContainerADP').setup({ - "file": "https://static.adplayer.pro/video/640.mp4", - "width": 640, - "height": 360, - "autoStart": true, - "muted": true, - "advertising": { - "tag": vastXml - } - }); - } - } - } - } - }); - }); -</script> -
-
-
-
- - - - - diff --git a/examples/video/outstream/pb-ve-outstream-radiant.html b/examples/video/outstream/pb-ve-outstream-radiant.html deleted file mode 100644 index ea027595ad..0000000000 --- a/examples/video/outstream/pb-ve-outstream-radiant.html +++ /dev/null @@ -1,215 +0,0 @@ ---- -layout: video_sample -title: Prebid Video | Video Outstream Example with Radiant Media Player -description: An example of an outstream video with a pre-roll ad using Prebid.js and Radiant Media Player. -videoType: pb-os-rd -isVideo: true -sidebarType: 4 ---- - - - -
-
-
-

{{ page.title }}

-

{{page.description }}

-
- - -
-

Important: - This example uses a test version of Prebid.js hosted on our CDN that is not recommended for production use. It includes all available adapters. Production implementations should build from source or customize the build using the Download page to make sure only the necessary bidder adapters are included.

-
- -
- -
-

Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum.

-
- - -
- -
-

Sed ut perspiciatis unde omnis iste natus error sit voluptatem accusantium doloremque laudantium, totam rem aperiam, eaque ipsa quae ab illo inventore veritatis et quasi architecto beatae vitae dicta sunt explicabo. Nemo enim ipsam voluptatem quia voluptas sit aspernatur aut odit aut fugit, sed quia consequuntur magni dolores eos qui ratione voluptatem sequi nesciunt. Neque porro quisquam est, qui dolorem ipsum quia dolor sit amet, consectetur, adipisci velit, sed quia non numquam eius modi tempora incidunt ut labore et dolore magnam aliquam quaerat voluptatem. Ut enim ad minima veniam, quis nostrum exercitationem ullam corporis suscipit laboriosam, nisi ut aliquid ex ea commodi consequatur? Quis autem vel eum iure reprehenderit qui in ea voluptate velit esse quam nihil molestiae consequatur, vel illum qui dolorem eum fugiat quo voluptas nulla pariatur?

-
-
- - - - - -
-

Warning: - Do not forget to exchange the placementId in the code examples with your own placementId!

-
- -

Place this code in the page header.

-
-
-
-<!--radiant code-->
-<script src="https://cdn.radiantmediatechs.com/rmp/5.5.6/js/rmp.debug.js"></script>
-      
-
- -

Place this code in the page body.

-
- -
-
-<script>
-  /* our app where we run player
-   our app variables */
-    var pbjs;
-    pbjs = pbjs || {};
-    pbjs.que = pbjs.que || [];
-    var debug = false;
-    if (typeof window.console === 'undefined' || typeof window.console.log === 'undefined' || typeof window.console.dir === 'undefined') {
-      debug = false;
-    }
-    var videoId = 'video1';
-
-    /* Prebid video ad unit
-       This is a working example but you must use your own settings/bidders for production
-       More docs at https://prebid.org/prebid-video/video-overview.html */
-    var adUnits = [{
-      code: videoId,
-      mediaTypes: {
-        video: {
-          context: 'outstream',
-                      playerSize: [640, 480],
-                      mimes: ['video/mp4'],
-                      protocols: [1, 2, 3, 4, 5, 6, 7, 8],
-                      playbackmethod: [2],
-                      skip: 1
-        }
-      },
-      bids: [{
-        bidder: 'appnexus',
-        params: {
-          placementId: 13232385
-        }
-      }]
-    }];
-
-    pbjs.que.push(function () {
-      pbjs.addAdUnits(adUnits);
-      pbjs.requestBids({
-        timeout: 1000,
-        bidsBackHandler: function (bids) {
-          if (debug) {
-            window.console.dir(bids);
-          }
-          // we get the VAST XML from bids adResponse and pass it to our outstream player
-          if (bids && bids[videoId] && bids[videoId].bids && bids[videoId].bids[0] && bids[videoId].bids[0].adResponse) {
-            var adResponse = bids[videoId].bids[0].adResponse;
-            if (adResponse.ad && adResponse.ad.video && typeof adResponse.ad.video.content === 'string') {
-              var vastXml = bids[videoId].bids[0].adResponse.ad.video.content;
-              if (vastXml !== '') {
-                if (debug) {
-                  window.console.log(vastXml);
-                }
-                var settings = {
-                  licenseKey: 'Kl8lZ292K3N6MmVvZD9yb201ZGFzaXMzMGRiMEElXyo=',
-                  width: 640,
-                  height: 360,
-                  autoplay: true,
-                  adOutStreamMutedAutoplay: true,
-                  ads: true,
-                  adsResponse: vastXml,
-                  adOutStream: true,
-                  skin: 'outstream'
-                };
-                var elementID = 'rmpPlayer';
-                var rmp = new RadiantMP(elementID);
-                rmp.init(settings);
-              }
-            }
-          }
-        }
-      });
-    });
-</script>
-      
-
-
-
- - - - - From ef8707e7efb3c2dab0262e512d0fd839a4deeb0a Mon Sep 17 00:00:00 2001 From: BaronJHYu <254878848@qq.com> Date: Fri, 28 Oct 2022 12:54:01 +0800 Subject: [PATCH 069/280] Update mediago.md (#4115) update compliance info --- dev-docs/bidders/mediago.md | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/dev-docs/bidders/mediago.md b/dev-docs/bidders/mediago.md index 238a6ba6d9..7de150c5d3 100644 --- a/dev-docs/bidders/mediago.md +++ b/dev-docs/bidders/mediago.md @@ -4,8 +4,12 @@ title: MediaGo description: MediaGo Prebid Bidder Adapter biddercode: mediago media_types: banner +gdpr_supported: true +coppa_supported: true +usp_supported: true pbjs: true floors_supported: true +gvl_id: 1020 pbjs_version_notes: not ported to 5.x, added back 7.13 --- ### Modules From 9c785fcc943fe1fb314a4362d4ca6a0941f8c73a Mon Sep 17 00:00:00 2001 From: matthieularere-msq <63732822+matthieularere-msq@users.noreply.github.com> Date: Fri, 28 Oct 2022 15:10:59 +0200 Subject: [PATCH 070/280] Add Oxxion Rtd Provider (#4070) * Create oxxionRtdProvide.md * Update oxxionRtdProvide.md * Update oxxionRtdProvide.md * Update oxxionRtdProvide.md --- dev-docs/modules/oxxionRtdProvide.md | 57 ++++++++++++++++++++++++++++ 1 file changed, 57 insertions(+) create mode 100644 dev-docs/modules/oxxionRtdProvide.md diff --git a/dev-docs/modules/oxxionRtdProvide.md b/dev-docs/modules/oxxionRtdProvide.md new file mode 100644 index 0000000000..e9978333be --- /dev/null +++ b/dev-docs/modules/oxxionRtdProvide.md @@ -0,0 +1,57 @@ +--- +layout: page_v2 +title: oxxion Real Time Data Provider +display_name: oxxion Rtd +description: oxxion Real-time Vast Impression Tracking +page_type: module +module_type: rtd +module_code : oxxionRtdProvider +enable_download : true +vendor_specific: true +sidebarType : 1 +--- + +# oxxion Rtd + +## Overview + +Oxxion helps you to understand how your prebid stack performs. +This Rtd module is to use in order to improve video events tracking. + +## Integration + +Make sure to have the following modules listed while building prebid : `rtdModule,oxxionRtdProvider` +`rtbModule` is required to activate real-time-data submodules. +For example : +``` +gulp build --modules=rtdModule,oxxionRtdProvider +``` + +Then add the oxxion Rtd module to your prebid configuration : +``` +pbjs.setConfig( + ... + realTimeData: { + auctionDelay: 200, + dataProviders: [ + { + name: "oxxionRtd", + waitForIt: true, + params: { + domain: "test.endpoint", + contexts: ["instream", "outstream"], + } + } + ] + } + ... +) +``` + +## setConfig Parameters + +| Name | Type | Description | +|:---------------------------------|:---------|:------------------------------------------------------------------------------------------------------------| +| domain | String | This string identifies yourself in Oxxion's systems and is provided to you by your Oxxion representative. | +| contexts | Array | Array defining which video contexts to add tracking events into. Values can be instream and/or outstream. | + From 768c2e5e75ad11b0dc63a59c0dcd78463c5e0263 Mon Sep 17 00:00:00 2001 From: Karim Mourra Date: Fri, 28 Oct 2022 13:18:36 -0400 Subject: [PATCH 071/280] Video Module: Initial Release (#4100) * adds video module section * populates independent integration section * populates SSP section * populates config and ad unit * populates features * populates bid enrichment * creates how to add subm * completes how to add * links to ad unit ref * adds module docs * populates payload descr * populates all params * cleans typos * adds requirements * Update dev-docs/add-video-submodule.md Co-authored-by: Andrew * adds missing punctuation * Add prebid video module to sidebar * Fix video-integrating-solo link * removes extra AdPlayer.Pro section * clarifies vendor code constants * putting spaces into the long args Co-authored-by: Andrew Co-authored-by: Nepomuk Seiler Co-authored-by: bretg --- .ruby-version | 1 + _data/sidebar.yml | 107 +++- dev-docs/add-video-submodule.md | 173 ++++++ dev-docs/adunit-reference.md | 54 +- dev-docs/modules/jwplayerVideoProvider.md | 19 + dev-docs/modules/video.md | 23 + dev-docs/modules/videojsVideoProvider.md | 19 + .../publisher-api-reference/addAdUnits.md | 31 +- dev-docs/publisher-api-reference/setConfig.md | 74 +++ prebid-video/video-getting-started.md | 123 +--- prebid-video/video-integrating-solo.md | 126 ++++ prebid-video/video-module.md | 576 ++++++++++++++++++ 12 files changed, 1181 insertions(+), 145 deletions(-) create mode 100644 .ruby-version create mode 100644 dev-docs/add-video-submodule.md create mode 100644 dev-docs/modules/jwplayerVideoProvider.md create mode 100644 dev-docs/modules/video.md create mode 100644 dev-docs/modules/videojsVideoProvider.md create mode 100644 prebid-video/video-integrating-solo.md create mode 100644 prebid-video/video-module.md diff --git a/.ruby-version b/.ruby-version new file mode 100644 index 0000000000..49cdd668e1 --- /dev/null +++ b/.ruby-version @@ -0,0 +1 @@ +2.7.6 diff --git a/_data/sidebar.yml b/_data/sidebar.yml index cdf76070c1..563989cdbd 100644 --- a/_data/sidebar.yml +++ b/_data/sidebar.yml @@ -394,6 +394,14 @@ sectionTitle: subgroup: 4 +- sbSecId: 1 + title: How to Add a Prebid.js Video submodule + link: /dev-docs/add-video-submodule.html + isHeader: 0 + isSectionHeader: 0 + sectionTitle: + subgroup: 4 + - sbSecId: 1 title: Vendor Billing in Prebid.js link: /dev-docs/vendor-billing.html @@ -1493,6 +1501,31 @@ sectionTitle: subgroup: 0 +- sbSecId: 4 + title: Prebid.js Video Module + link: + isHeader: 1 + headerId: pbjsVideoModule + isSectionHeader: 0 + sectionTitle: + subgroup: 1 + +- sbSecId: 4 + title: Prebid Video Module + link: /prebid-video/video-module.html + isHeader: 0 + isSectionHeader: 0 + sectionTitle: + subgroup: 1 + +- sbSecId: 4 + title: Integrating Prebid.js with video on your own + link: /prebid-video/video-integrating-solo.html + isHeader: 0 + isSectionHeader: 0 + sectionTitle: + subgroup: 1 + - sbSecId: 4 title: Examples link: @@ -1500,7 +1533,7 @@ headerId: videxamples isSectionHeader: 0 sectionTitle: - subgroup: 1 + subgroup: 2 - sbSecId: 4 title: "Instream" @@ -1509,7 +1542,7 @@ isSectionHeader: 0 isCatHeader: 1 sectionTitle: - subgroup: 1 + subgroup: 2 - sbSecId: 4 title: 'Akamai AMP' @@ -1517,7 +1550,7 @@ isHeader: 0 isSectionHeader: 0 sectionTitle: - subgroup: 1 + subgroup: 2 - sbSecId: 4 title: 'AdPlayer.Pro' @@ -1525,7 +1558,7 @@ isHeader: 0 isSectionHeader: 0 sectionTitle: - subgroup: 1 + subgroup: 2 - sbSecId: 4 title: 'Brid' @@ -1533,7 +1566,7 @@ isHeader: 0 isSectionHeader: 0 sectionTitle: - subgroup: 1 + subgroup: 2 - sbSecId: 4 title: 'Brightcove' @@ -1541,7 +1574,7 @@ isHeader: 0 isSectionHeader: 0 sectionTitle: - subgroup: 1 + subgroup: 2 - sbSecId: 4 title: 'Flowplayer' @@ -1550,7 +1583,7 @@ isHeader: 0 isSectionHeader: 0 sectionTitle: - subgroup: 1 + subgroup: 2 - sbSecId: 4 title: 'JW Player (Platform)' @@ -1558,7 +1591,7 @@ isHeader: 0 isSectionHeader: 0 sectionTitle: - subgroup: 1 + subgroup: 2 - sbSecId: 4 title: 'JW Player (Self-Hosted)' @@ -1566,7 +1599,7 @@ isHeader: 0 isSectionHeader: 0 sectionTitle: - subgroup: 1 + subgroup: 2 - sbSecId: 4 title: 'Kaltura' @@ -1574,7 +1607,7 @@ isHeader: 0 isSectionHeader: 0 sectionTitle: - subgroup: 1 + subgroup: 2 - sbSecId: 4 title: 'Ooyala' @@ -1582,7 +1615,7 @@ isHeader: 0 isSectionHeader: 0 sectionTitle: - subgroup: 1 + subgroup: 2 - sbSecId: 4 title: 'Radiant' @@ -1590,7 +1623,7 @@ isHeader: 0 isSectionHeader: 0 sectionTitle: - subgroup: 1 + subgroup: 2 - sbSecId: 4 title: 'VideoJS' @@ -1598,7 +1631,7 @@ isHeader: 0 isSectionHeader: 0 sectionTitle: - subgroup: 1 + subgroup: 2 - sbSecId: 4 title: "Prebid Server" @@ -1607,7 +1640,7 @@ isSectionHeader: 0 isCatHeader: 1 sectionTitle: - subgroup: 1 + subgroup: 2 - sbSecId: 4 title: 'Brid' @@ -1615,7 +1648,7 @@ isHeader: 0 isSectionHeader: 0 sectionTitle: - subgroup: 1 + subgroup: 2 - sbSecId: 4 title: 'JW Player (Platform)' @@ -1623,7 +1656,7 @@ isHeader: 0 isSectionHeader: 0 sectionTitle: - subgroup: 1 + subgroup: 2 - sbSecId: 4 title: 'JW Player (Self-Hosted)' @@ -1631,7 +1664,7 @@ isHeader: 0 isSectionHeader: 0 sectionTitle: - subgroup: 1 + subgroup: 2 - sbSecId: 4 title: 'Kaltura' @@ -1639,7 +1672,7 @@ isHeader: 0 isSectionHeader: 0 sectionTitle: - subgroup: 1 + subgroup: 2 - sbSecId: 4 title: 'Ooyala' @@ -1647,7 +1680,7 @@ isHeader: 0 isSectionHeader: 0 sectionTitle: - subgroup: 1 + subgroup: 2 - sbSecId: 4 title: 'Radiant' @@ -1655,7 +1688,7 @@ isHeader: 0 isSectionHeader: 0 sectionTitle: - subgroup: 1 + subgroup: 2 - sbSecId: 4 title: 'VideoJS' @@ -1663,7 +1696,7 @@ isHeader: 0 isSectionHeader: 0 sectionTitle: - subgroup: 1 + subgroup: 2 - sbSecId: 4 title: "Cross Player" @@ -1672,7 +1705,7 @@ isSectionHeader: 0 isCatHeader: 1 sectionTitle: - subgroup: 1 + subgroup: 2 - sbSecId: 4 title: 'Flowplayer' @@ -1680,7 +1713,7 @@ isHeader: 0 isSectionHeader: 0 sectionTitle: - subgroup: 1 + subgroup: 2 - sbSecId: 4 title: 'JW Player' @@ -1688,7 +1721,7 @@ isHeader: 0 isSectionHeader: 0 sectionTitle: - subgroup: 1 + subgroup: 2 - sbSecId: 4 title: 'Kaltura' @@ -1696,7 +1729,7 @@ isHeader: 0 isSectionHeader: 0 sectionTitle: - subgroup: 1 + subgroup: 2 - sbSecId: 4 title: 'VideoJS' @@ -1704,7 +1737,7 @@ isHeader: 0 isSectionHeader: 0 sectionTitle: - subgroup: 1 + subgroup: 2 - sbSecId: 4 title: "Outstream" @@ -1713,7 +1746,7 @@ isSectionHeader: 0 isCatHeader: 1 sectionTitle: - subgroup: 1 + subgroup: 2 - sbSecId: 4 title: 'Basic IMA' @@ -1721,7 +1754,7 @@ isHeader: 0 isSectionHeader: 0 sectionTitle: - subgroup: 1 + subgroup: 2 - sbSecId: 4 title: 'Google Ad Manager' @@ -1729,7 +1762,15 @@ isHeader: 0 isSectionHeader: 0 sectionTitle: - subgroup: 1 + subgroup: 2 + +- sbSecId: 4 + title: 'Radiant' + link: /examples/video/outstream/pb-ve-outstream-radiant.html + isHeader: 0 + isSectionHeader: 0 + sectionTitle: + subgroup: 2 - sbSecId: 4 title: 'No Server' @@ -1737,7 +1778,7 @@ isHeader: 0 isSectionHeader: 0 sectionTitle: - subgroup: 1 + subgroup: 2 - sbSecId: 4 title: 'No Server (Specify Renderer)' @@ -1745,7 +1786,7 @@ isHeader: 0 isSectionHeader: 0 sectionTitle: - subgroup: 1 + subgroup: 2 - sbSecId: 4 title: "Long-Form (Ad Pods)" @@ -1754,7 +1795,7 @@ isSectionHeader: 0 isCatHeader: 1 sectionTitle: - subgroup: 1 + subgroup: 2 - sbSecId: 4 title: 'Freewheel' @@ -1762,7 +1803,7 @@ isHeader: 0 isSectionHeader: 0 sectionTitle: - subgroup: 1 + subgroup: 2 #--------------Prebid Server--------------| diff --git a/dev-docs/add-video-submodule.md b/dev-docs/add-video-submodule.md new file mode 100644 index 0000000000..e0ee0109bf --- /dev/null +++ b/dev-docs/add-video-submodule.md @@ -0,0 +1,173 @@ +--- +layout: page_v2 +title: How to Add a Prebid.js Video submodule +description: How to Add a Prebid.js Video submodule +sidebarType: 1 +--- + +# How to Add a Video Submodule +{:.no_toc} + +Video submodules interact with the Video Module to integrate Prebid with Video Players, allowing Prebid to automatically: +- render bids in the desired video player. +- mark used bids as won. +- trigger player and media events. +- populate the oRTB Video Impression and Content params in the bid request. + +* TOC + {:toc } + +## Overview + +The Prebid Video Module simplifies the way Prebid integrates with video players by acting as a single point of contact for everything video. +In order for the Video Module to connect to a video player, a submodule must be implemented. The submodule acts as a bridge between the Video Module and the video player. +The Video Module will route commands and tasks to the appropriate submodule instance. +A submodule is expected to work for a specific video player. i.e. the JW Player submodule is used to integrate Prebid with JW Player. The video.js submdule connects to video.js. +Publishers who use players from different vendors on the same page can use multiple video submodules. + +## Requirements + +The Video Module only supports integration with Video Players that meet the following requirements: +- Must support parsing and reproduction of VAST ads. + - Input can be an ad tag URL or the actual Vast XML. +- Must expose an API that allows the procurement of [Open RTB params](https://www.iab.com/wp-content/uploads/2016/03/OpenRTB-API-Specification-Version-2-5-FINAL.pdf) for Video (section 3.2.7) and Content (section 3.2.16). +- Must emit javascript events for Ads and Media. + - see [Event Registration](#event-registration). + +## Creating a Submodule + +Working with any Prebid project requires using Github. In general, we recommend the same basic workflow for any project: + +1. Fork the appropriate Prebid repository (e.g. [Prebid.js](https://github.com/prebid/Prebid.js)). +2. Create a branch in your fork for your proposed code change (e.g. feature/exampleVideoProvider). +3. Build and test your feature/bug fix in the branch. +4. Open a [pull request](https://help.github.com/en/desktop/contributing-to-projects/creating-a-pull-request) to the appropriate repository's master branch with a good description of the feature/bug fix. +5. If there's something that needs to change on the prebid.org website, follow the above steps for the [website repo](https://github.com/prebid/prebid.github.io). + +### Step 1: Add a markdown file describing the submodule + +Create a markdown file under `modules` with the name of the module suffixed with 'VideoProvider', i.e. `exampleVideoProvider.md`. + +Example markdown file: +{% highlight text %} +# Overview + +Module Name: Example Video Provider +Module Type: Video Submodule +Video Player: Example player +Player website: example-player.com +Maintainer: someone@example.com + +# Description + +Video provider for Example Player. Contact someone@example.com for information. + +# Requirements + +Your page must link the Example Player build from our CDN. Alternatively you can use npm to load the build. + +{% endhighlight %} + +### Step 2: Add a Vendor Code + +Vendor codes are required to indicate which submodule type to instantiate. Add your vendor code constant to an export const in `vendorCodes.js` in Prebid.js under `libraries/video/constants/vendorCodes.js`. +i.e. in `vendorCodes.js`: + +{% highlight text %} +export const EXAMPLE_PLAYER_VENDOR = 3; +{% endhighlight %} + +### Step 2: Build the Module + +Now create a javascript file under `modules` with the name of the module suffixed with 'VideoProvider', e.g., `exampleVideoProvider.js`. + +#### The Submodule factory + +The Video Module will need a submodule instance for every player instance registered with Prebid. You will therefore need to implement a submodule factory which is called with a `videoProviderConfig` argument and returns a Video Provider instance. +Your submodule should import your vendor code constant and set it to a `vendorCode` property on your submodule factory. +Your submodule should also import the `submodule` function from `src/hook.js` and should use it to register as a submodule of `'video'`. + +**Code Example** + +{% highlight text %} +import { submodule } from '../src/hook.js'; + +function exampleSubmoduleFactory(videoProviderConfig) { + const videoProvider = { + // implementation + }; + + return videoProvider; +} + +exampleSubmoduleFactory.vendorCode = EXAMPLE_VENDOR; +submodule('video', exampleSubmoduleFactory); +{% endhighlight %} + +#### The Submodule object + +The submodule object must adhere to the following interface: +{: .table .table-bordered .table-striped } +| param name | type | Scope | Description | Arguments | Return type | +| :---------- | :---- | :---- | :---------- | :-------- | :---------- | +| init | function | required | Initializes the submodule and the video player, if not already instantiated. | n/a | void | +| getId | function | required | Returns the divId (unique identifier) of the associated video player. | n/a | string | +| getOrtbVideo | function | required | Returns the oRTB Video object for the associated video player. See [oRTB spec’s](https://www.iab.com/wp-content/uploads/2016/03/OpenRTB-API-Specification-Version-2-5-FINAL.pdf) video section 3.2.7. | n/a | object | +| getOrtbContent | function | required | Returns the oRTB Content object for the associated video player and its media's metadata. See [oRTB spec’s](https://www.iab.com/wp-content/uploads/2016/03/OpenRTB-API-Specification-Version-2-5-FINAL.pdf) content section 3.2.16. | n/a | object | +| setAdTagUrl | function | required | Requests that the video player load and begin playing the given ad tag url. | adTagUrl: string | void | +| onEvent | function | required | Registers event listeners for the given event strings to the player instance. | externalEventName: string, callback: function, basePayload: object | void | +| offEvent | function | required | Removes event listeners for the given event strings to the player instance. | event: string, callback: function | void | +| destroy | function | required | Deallocates the submodule and destroys the associated video player. n/a | void | void | + +For example: +{% highlight text %} +const exampleSubmodule = { + init: init, + getId: getId, + getOrtbVideo: getOrtbVideo, + getOrtbContent: getOrtbContent, + setAdTagUrl: setAdTagUrl, + onEvent: onEvent, + offEvent: offEvent, + destroy: destroy +}; +{% endhighlight %} + +
+ +#### Event registration + +Submodules must support attaching and detaching event listeners on the video player. The list of events and their respective params are defined in the [Video Module docs's Events section]({{site.github.url}}/prebid-video/video-module.html#events). + +##### onEvent + +{: .table .table-bordered .table-striped } +| argument name | type | description | +| event | string | Name of event for which the listener should be added | +| callback | function | Function that will get called when the event is triggered. The function will be called with a payload argument containing metadata for the event | +| basePayload | object | Base payload for every event; includes common parameters such as divId and type. The event payload should be built on top of this | + +##### offEvent + +{: .table .table-bordered .table-striped } +| argument name | type | description | +| event | string | name of event for which the attached listener should be removed | +| callback | function | function that was assigned as a callback when the listener was added | + +#### Update .submodules.json + +In prebid.js, add your new submodule to `.submodules.json` under the `videoModule` as such: +{% highlight text %} +{ + "parentModules": { + "videoModule": [ + "exampleVideoProvider" + ] + } +} +{% endhighlight %} + +### Shared resources for developers + +A video library containing reusable code and constants has been added to Prebid.js for your convenience. We encourage you to import from this library. +Constants such as event names can be found in the `libraries/video/constants/` folder. diff --git a/dev-docs/adunit-reference.md b/dev-docs/adunit-reference.md index db51c0a7e3..9ea7ffc306 100644 --- a/dev-docs/adunit-reference.md +++ b/dev-docs/adunit-reference.md @@ -38,6 +38,7 @@ See the table below for the list of properties on the ad unit. For example ad u | `labelAll` | Optional | Array[String] | Used for [conditional ads][conditionalAds]. Works with `sizeConfig` argument to [pbjs.setConfig][configureResponsive]. | | `ortb2Imp` | Optional | Object | ortb2Imp is used to signal OpenRTB Imp objects at the adUnit grain. Similar to the global ortb2 field used for [global first party data configuration](/dev-docs/publisher-api-reference/setConfig.html#setConfig-fpd), but specific to this adunit. The ortb2Imp object currently supports [first party data](#adUnit-fpd-example) including the [Prebid Ad Slot](/features/pbAdSlot.html) and the [interstitial](#adUnit-interstitial-example) signal. | | `renderer` | Optional | Object | Custom renderer, typically used for [outstream video](/dev-docs/show-outstream-video-ads.html) | +| `video` | Optional | Object | Used to link an Ad Unit to the [Video Module][videoModule]. For allowed params see the [adUnit.video reference](#adUnit-video). | @@ -231,10 +232,29 @@ If `'video.context'` is set to `'adpod'` then the following parameters are also + + +### adUnit.video + +See the table below for the list of properties in the `video` object of the ad unit. For example ad units, see the [Example](#adUnit-video-module-example) below. + +**Note:** your Ad Unit must have `mediaTypes.video` defined and your prebid instance should be configured to use the [Video Module][videoModule]. +When using the Video Module, the mediaTypes.video properties get filled out automatically. Any values already set by the Publisher will not be replaced by the Video Module. + +{: .table .table-bordered .table-striped } +| Field | Scope | Type | Description | +|----------+--------------------------------------------------------------+--------+--------------------------------------------------------------------------------------------------------------------| +| `divId` | required | string | Unique identifier of the player provider, used to specify which player should be used to render the ad. Equivalent to the HTML Div Id of the player. | +| `adServer` | optional | object | Configuration for ad server integration. Supersedes `video.adServer` configurations defined in the Prebid Config. | +| `adServer.vendorCode` | required if `adServer` is defined | string | The identifier of the AdServer vendor (i.e. gam, etc). | +| `adServer.baseAdTagUrl` | required if `adServer.params` is not defined | string | Your AdServer Ad Tag. The targeting params of the winning bid will be appended. | +| `adServer.params` | required if `adServer.baseAdTagUrl` is not defined | object | Querystring parameters that will be used to construct the video ad tag URL. | + ## Examples + [Banner](#adUnit-banner-example) + [Video](#adUnit-video-example) + - [With the Video Module](#adUnit-video-module-example) - [Instream](#adUnit-video-example-instream) - [Outstream](#adUnit-video-example-outstream) - [Adpod (Long-Form)](#adUnit-video-example-adpod) @@ -272,11 +292,38 @@ pbjs.addAdUnits({ ### Video + + +#### With the Video Module + +For an example of a video ad unit linked to the Video Module, see below. For more detailed instructions see the [Video Module docs][videoModule]. +```javascript +pbjs.addAdUnits({ + code: slot.code, + mediaTypes: { + video: {}, + }, + video: { + divId: 'playerDiv', + adServer: { + vendorCode: 'gam', // constant variable is GAM_VENDOR - see vendorCodes.js in the video library + baseAdTagUrl: 'https://pubads.g.doubleclick.net/gampad/ads?iu=/12345/' + } + }, + bids: [{ + bidder: 'appnexus', + params: { + placementId: 13232361 + } + }] +}); +``` + #### Instream -For an example of an instream video ad unit, see below. For more detailed instructions, see [Show Video Ads]({{site.baseurl}}/dev-docs/show-video-with-a-dfp-video-tag.html). +For an example of an instream video ad unit that you handle on your own, see below. For more detailed instructions, see [Show Video Ads]({{site.baseurl}}/dev-docs/show-video-with-a-dfp-video-tag.html). ```javascript pbjs.addAdUnits({ @@ -304,7 +351,7 @@ pbjs.addAdUnits({ #### Outstream -For an example of an outstream video ad unit, see below. For more detailed instructions, see [Show Outstream Video Ads]({{site.baseurl}}/dev-docs/show-outstream-video-ads.html). +For an example of an outstream video ad unit that you handle on your own, see below. For more detailed instructions, see [Show Outstream Video Ads]({{site.baseurl}}/dev-docs/show-outstream-video-ads.html). ```javascript pbjs.addAdUnits({ @@ -358,7 +405,7 @@ pbjs.addAdUnits({ #### Adpod (Long-Form) -For an example of an adpod video ad unit, see below. For more detailed instructions, see [Show Long-Form Video Ads]({{site.baseurl}}/prebid-video/video-long-form.html). +For an example of an adpod video ad unit that you handle on your own, see below. For more detailed instructions, see [Show Long-Form Video Ads]({{site.baseurl}}/prebid-video/video-long-form.html). ```javascript var longFormatAdUnit = { @@ -640,3 +687,4 @@ For more information on Interstitial ads, reference the [Interstitial feature pa [openRTB]: https://www.iab.com/wp-content/uploads/2016/03/OpenRTB-API-Specification-Version-2-5-FINAL.pdf [pbServer]: {{site.baseurl}}/prebid-server/overview/prebid-server-overview.html [OpenMeasurement]: https://iabtechlab.com/standards/open-measurement-sdk/ +[videoModule]: {{site.github.url}}/prebid-video/video-module.html diff --git a/dev-docs/modules/jwplayerVideoProvider.md b/dev-docs/modules/jwplayerVideoProvider.md new file mode 100644 index 0000000000..451f4986c1 --- /dev/null +++ b/dev-docs/modules/jwplayerVideoProvider.md @@ -0,0 +1,19 @@ +--- +layout: page_v2 +page_type: module +title: Module - JW Player Video Submodule +description: Allows Prebid to integrate directly with JW Player video players. +module_code : jwplayerVideoProvider +display_name : JW Player Video Provider +enable_download : true +vendor_specific: true +sidebarType : 1 +--- + +# JW Player Video Provider + +The JW Player Video Provider is a submodule of the Prebid Video Module. + +The JW Player Vendor Code for the Video Module is `1`. + +For information on how to use the Video Module with JW Player please visit the [docs]({{site.github.url}}/prebid-video/video-module.html). diff --git a/dev-docs/modules/video.md b/dev-docs/modules/video.md new file mode 100644 index 0000000000..c2e2044710 --- /dev/null +++ b/dev-docs/modules/video.md @@ -0,0 +1,23 @@ +--- +layout: page_v2 +title: Module - Video Module +display_name: Prebid Video Module +description: The Prebid Video Module allows Prebid to directly integrate with a Video Player. +page_type: module +module_code : video +enable_download : true +vendor_specific: false +sidebarType : 1 +--- + +# Prebid Video Module + +The Prebid Video Module allows Prebid to directly integrate with a Video Player. + +When the Video Module is setup, Prebid.js will automatically: +- render bids in the desired video player +- mark used bids as won +- trigger player and media events +- fill the oRTB Video Impression and Content params in the bid request + +For details on how to use the Video Module please visit the [docs]({{site.github.url}}/prebid-video/video-module.html). diff --git a/dev-docs/modules/videojsVideoProvider.md b/dev-docs/modules/videojsVideoProvider.md new file mode 100644 index 0000000000..603ab01b19 --- /dev/null +++ b/dev-docs/modules/videojsVideoProvider.md @@ -0,0 +1,19 @@ +--- +layout: page_v2 +page_type: module +title: Module - Video.js Video Submodule +description: Allows Prebid to integrate directly with Video.js video players. +module_code : videojsVideoProvider +display_name : Video.js Video Provider +enable_download : true +vendor_specific: true +sidebarType : 1 +--- + +# Video.js Video Provider + +The Video.js Video Provider is a submodule of the Prebid Video Module. + +The Video.js Vendor Code for the Video Module is `2`. + +For information on how to use the Video Module for video.js please visit the [docs]({{site.github.url}}/prebid-video/video-module.html). diff --git a/dev-docs/publisher-api-reference/addAdUnits.md b/dev-docs/publisher-api-reference/addAdUnits.md index 1ad30680b8..7679e3b8b1 100644 --- a/dev-docs/publisher-api-reference/addAdUnits.md +++ b/dev-docs/publisher-api-reference/addAdUnits.md @@ -25,6 +25,7 @@ See the table below for the list of properties on the ad unit. For example ad u | `mediaTypes` | Optional | Object | Defines one or multiple media types the ad unit supports. For a list of properties, see [Media Types](#addAdUnits-MediaTypes) below. | | `labelAny` | optional | array | An array of string labels, used for showing responsive ads. With the `labelAny` operator, just one label has to match for the condition to be true. Works with the `sizeConfig` object passed in to [pbjs.setConfig]({{site.baseurl}}/dev-docs/publisher-api-reference/setConfig.html). | | `labelAll` | optional | array | An array of string labels, used for showing responsive and conditional ads. With the `labelAll` conditional, every element of the target array must match an element of the label array in order for the condition to be true. Works with the `sizeConfig` object passed in to [pbjs.setConfig]({{site.baseurl}}/dev-docs/publisher-api-reference/setConfig.html). | +| `video` | Optional | Object | Used to link an Ad Unit to the [Video Module]({{site.github.url}}/prebid-video/video-module.html). For allowed params see the [adUnit.video reference](#adUnit-video). | @@ -56,6 +57,10 @@ See the table below for the list of properties in the `mediaTypes` object of the | `native` | optional | Object | Defines properties of a native ad. For an example native ad unit, see [the native example below](#adUnit-native). | | `video` | optional | Object | Defines properties of a video ad. For examples, see [the video examples below](#adUnit-video). | +#### Video + +For the list of properties please visit the [adUnit.video reference]({{site.baseurl}}/dev-docs/adunit-reference.html#adUnit.video). + #### Examples @@ -117,7 +122,31 @@ pbjs.addAdUnits({ ##### Video -For an example of an instream video ad unit, see below. For more detailed instructions, see [Show Video Ads]({{site.baseurl}}/dev-docs/show-video-with-a-dfp-video-tag.html). +If using the Video Module, see below. For more information on the Video Module, see the [Video Module docs]({{site.github.url}}/prebid-video/video-module.html). + +```javascript +pbjs.addAdUnits({ + code: slot.code, + mediaTypes: { + video: {}, + }, + video: { + divId: 'playerDiv', + adServer: { + vendorCode: 'gam', // constant variable is GAM_VENDOR - see vendorCodes.js in the video library + baseAdTagUrl: 'https://pubads.g.doubleclick.net/gampad/ads?iu=/12345/' + } + }, + bids: [{ + bidder: 'appnexus', + params: { + placementId: 13232361 + } + }] +}); +``` + +For an example of an instream video ad unit where the integration is handled on your own, see below. For more detailed instructions, see [Show Video Ads]({{site.baseurl}}/dev-docs/show-video-with-a-dfp-video-tag.html). ```javascript pbjs.addAdUnits({ diff --git a/dev-docs/publisher-api-reference/setConfig.md b/dev-docs/publisher-api-reference/setConfig.md index f58c7a6c74..b2997186a4 100644 --- a/dev-docs/publisher-api-reference/setConfig.md +++ b/dev-docs/publisher-api-reference/setConfig.md @@ -33,6 +33,7 @@ Core config: + [Configure responsive ad units with `sizeConfig` and `labels`](#setConfig-Configure-Responsive-Ads) + [COPPA](#setConfig-coppa) + [First Party Data](#setConfig-fpd) ++ [Video Module to integrate with Video Players](#video-module) + [Caching VAST XML](#setConfig-vast-cache) + [Site Metadata](#setConfig-site) + [Disable performance metrics](#setConfig-performanceMetrics) @@ -1086,6 +1087,79 @@ See the [AdUnit Reference](/dev-docs/adunit-reference.html) for AdUnit-specific See [Prebid Server First Party Data](/prebid-server/features/pbs-fpd.html) for details about passing data server-side. + + +#### Video Module to integrate with Video Players + +The Prebid Video Module allows Prebid to directly integrate with a Video Player, allowing Prebid to automatically load the winning ad into the player, mark bids as won, fill the video and content oRTB params in the bid request, surface video analytics, and more. For more information please visit the [Video Module docs]({{site.github.url}}/prebid-video/video-module.html). +To register a video player with Prebid, you must use `setConfig` to set a `video` config compliant with the following structure: + +{: .table .table-bordered .table-striped } +| Field | Required? | Type | Description | +|---|---|---|---| +| video.providers[] | yes | array of objects | List of Provider configurations. You must define a provider configuration for each player instance that you would like integrate with. | +| video.providers[] .vendorCode | yes | number | The identifier of the Video Provider vendor (i.e. 1 for JW Player, 2 for videojs, etc). Allows Prebid to know which submodule to instantiate. | +| video.providers[].divId | yes | string | The HTML element id of the player or its placeholder div. All analytics events for that player will reference this ID. Additionally, used to indicate which HTLM element must contain the Video Player instance when instantiated. | +| video.providers[] .playerConfig.autoStart | no | boolean | Defaults to false | +| video.providers[] .playerConfig.mute | no | boolean | Defaults to false | +| video.providers[] .playerConfig.licenseKey | no | boolean | The license key or account key. Required by most commercial video players. | +| video.providers[] .playerConfig.setupAds | no | boolean | Defaults to true. Setting to false will prevent Prebid from setting up the ads components for the player. Disable when you wish to setup the player's ad components yourself. | +| video.providers[] .playerConfig.params .vendorConfig | no | object | The configuration block specific to a video player. Use this when setting configuration options not available in `video.providers[].playerConfig`. Its properties supersede the equivalents in `video.providers[].playerConfig`. | +| video.providers[] .playerConfig.params .adPluginConfig | no | object | The configuration block specific to the video player's ad plugin. Use this to customize the ad experience. The configuration spec is defined by your video player's ad plugin. | +| video.providers[] .adServer | no | object | Configuration for ad server integration. Applies to all Ad Units linked to a video provider. Superseded by `video.adServer` configurations defined at the Ad Unit level. | +| video.providers[] .adServer.vendorCode | yes | string | The identifier of the AdServer vendor (i.e. gam, etc) | +| video.providers[] .adServer.baseAdTagUrl | yes | string | Your AdServer Ad Tag. The targeting params of the winning bid will be appended. Required when `video.providers[].adServer.params` is absent. | +| video.providers[] .adServer.params | yes | object | Querystring parameters that will be used to construct the video ad tag URL. Required when `video.providers[].adServer.baseAdTagUrl` is absent. | +| video.contentEnrichmentEnabled | no | boolean | Defaults to true. Set to false to prevent the Video Module from enriching the `site.content` params in the bidder request. | +| video.mainContentDivId | no | string | Div Id of the video player intended to populate the `bidderRequest.site.content` params. Used when multiple video players are registered with the Video Module to indicate which player is rendering the main content. The `bidderRequest.site.content` params will be populated by said video player for all auctions where a Video Player is registered with an Ad Unit in the auction. | +| video.adServer | no | object | Configuration for ad server integration. Applies to all Video Providers and all Ad Units linked to a video provider. Superseded by `video.adServer` configurations defined at the Ad Unit level, and `video.providers[] .adServer` configurations. | +| video.adServer .vendorCode | yes | string | The identifier of the AdServer vendor (i.e. gam, etc) | +| video.adServer .baseAdTagUrl | yes | string | Your AdServer Ad Tag. The targeting params of the winning bid will be appended. Required when `video.adServer.params` is absent. | +| video.adServer .params | yes | object | Querystring parameters that will be used to construct the video ad tag URL. Required when `video.adServer.baseAdTagUrl` is absent. | + +**Note:** You can integrate with different Player vendors. For this to work, you must ensure that the right Video Submodules are included in your build, and that the providers have the right `vendorCode`s and `divId`s. + +##### Example + +Assuming your page has 2 JW Player video players, 1 video.js video player, and your ad server is GAM. +{% highlight js %} +pbjs.setConfig({ + video: { + providers: [{ + vendorCode: 1, // constant variable is JWPLAYER_VENDOR - see vendorCodes.js in the video library + divId: 'jwplayer-div-1', + playerConfig: { + autoStart: true, + } + }, { + vendorCode: 2, // constant variable is VIDEO_JS_VENDOR - see vendorCodes.js in the video library + divId: 'videojs-div', + playerConfig: { + params : { + adPluginConfig: { + numRedirects: 10 + }, + vendorConfig: { + controls: true, + preload: "auto", + } + } + } + }, { + vendorCode: 1, // constant variable is JWPLAYER_VENDOR - see vendorCodes.js in the video library + divId: 'jwplayer-div-2', + playerConfig: { + mute: true + } + }], + adServer: { + vendorCode: 'gam', // constant variable is GAM_VENDOR - see vendorCodes.js in the video library + baseAdTagUrl: 'https://pubads.g.doubleclick.net/gampad/ads?iu=/12345/' + } + } +}); +{% endhighlight %} + #### Client-side Caching of VAST XML diff --git a/prebid-video/video-getting-started.md b/prebid-video/video-getting-started.md index 65c00748f5..340854e423 100644 --- a/prebid-video/video-getting-started.md +++ b/prebid-video/video-getting-started.md @@ -57,121 +57,28 @@ If you already have a Prebid integration for banner, you don’t need to do anyt Your first step to implementing header bidding for video is to [download Prebid.js]({{site.github.url}}/download.html). Before downloading, select the adapters you want to include. (You can add more adapters later.) -- Include at least one video adapter. Find a list of available video adapters [here]({{site.github.url}}/dev-docs/bidders.html#bidder-video-native). -- If Google Ad Manager is your ad server, you must include the [Google Ad Manager Video module](/dev-docs/publisher-api-reference/adServers.dfp.buildVideoUrl.html). -- If you’ll be integrating with Prebid Server, be sure to include “Prebid Server” in the list of adapters. +- Include at least one bid adapter that supports video. Find a list of eligible adapters [here]({{site.github.url}}/dev-docs/bidders.html#bidder-video-native). +- If Google Ad Manager is your ad server, you must include the [Google Ad Manager Video module](/dev-docs/publisher-api-reference/adServers.dfp.buildVideoUrl.html). +- If you’ll be integrating with Prebid Server, be sure to include “Prebid Server” in the list of adapters. -### Define Prebid Ad Units +### How to integrate -Setting up Prebid ad units is almost the same whether you’re working with instream video ads or outstream. The primary difference is specifying the type of video ad (instream or outstream), which you do in the mediaTypes.video.context field: +#### Prebid Video Module -``` - var adUnit1 = { - code: 'videoAdUnit', - mediaTypes: { - video: { - context: 'instream', //or 'outstream' - playerSize: [640, 480], - mimes: ['video/mp4'], // required for Prebid Server - protocols: [1, 2, 3, 4, 5, 6, 7, 8], - playbackmethod: [2], - skip: 1 - } -``` +{: .alert.alert-warning :} +The Video Module is a new way of handling Video in Prebid. -The mediaTypes.video.playerSize field is where you define the player size that will be passed to demand partners. +To integrate Prebid with a video player, we recommend using the Video Module. The Video Module will allow Prebid.js to automatically: +- render bids in your desired video player +- mark used bids as won +- trigger player and media events +- fill the oRTB Video Impression and Content params in the bid request -
- Prebid Server -

If you’re using Prebid Server, you must also include the mediaTypes.video.mimes field, as this is required by OpenRTB.

-
+For details on how to configure follow these [instructions]({{site.github.url}}/prebid-video/video-module.html). -For full details on video ad unit parameters, see [Ad Unit Reference for Video]({{site.baseurl}}/dev-docs/adunit-reference.html#adunitmediatypesvideo) - -In your ad unit you also need to define your list of bidders. For example, including AppNexus as a bidder would look something like this: - -``` - var adUnit1 = { - ... - bids: [{ - bidder: 'appnexus', - params: { - placementId: '123456789', - } - }] -``` - -The parameters differ depending on which bidder you’re including. For a list of parameters for each bidder, see [Bidders’ Params]({{site.github.url}}/dev-docs/bidders.html). - -For full details on creating instream video ad units, see [Show Video Ads with Google Ad Manager – Create Ad Unit]({{site.github.url}}/dev-docs/show-video-with-a-dfp-video-tag.html#create-a-video-ad-unit). - -For full details on creating outstream video ad units, see [Show Outstream Video Ads – Create Ad Unit]({{site.github.url}}/dev-docs/show-outstream-video-ads.html#step-1-set-up-ad-units-with-the-video-media-type-and-outstream-context). - -### Configuration - -After you’ve defined your ad units, you can continue with the rest of your configuration. In -most cases for video, the first step will be to define where the VAST XML coming back in the bids -will be stored. Some bidders have you covered here -- the VAST is stored on their servers. But -many bidders don't have their own server-side cache. - -{: .alert.alert-success :} -Video players expect that the response from the ad server will be a URL that points to somewhere -on the internet that stores the video ad creative. This URL can't point to the browser, -so Prebid.js will send bid VAST XML out to a cache so it can be displayed if it wins in the ad server. - -Configuring the video cache is done with [`setConfig`](/dev-docs/publisher-api-reference/setConfig.html#setConfig-vast-cache): - -``` - pbjs.setConfig({ - cache: { - url: 'https://prebid.adnxs.com/pbc/v1/cache' - /* Or whatever your preferred video cache URL is */ - } - }); -``` - - -And this is where setups for instream and outstream diverge. Please follow one of these links: - -- Instream: [Show Video Ads with Google Ad Manager]({{site.github.url}}/dev-docs/show-video-with-a-dfp-video-tag.html) -- Outstream: [Show Outstream Video Ads]({{site.github.url}}/dev-docs/show-outstream-video-ads.html) - -Be sure to note the setting for price granularity. You might need to set up a custom price granularity. (See “Custom CPM Bucket Sizing” under [Price Granularity](/dev-docs/publisher-api-reference/setConfig.html#setConfig-Price-Granularity). Or, if you’re monetizing both banner and video inventory with Prebid, you might need to define format-specific price granularity settings through [mediaTypePriceGranularity](/dev-docs/publisher-api-reference/setConfig.html#setConfig-MediaType-Price-Granularity). - -{: .alert.alert-info :} -**Prebid Server** If you’re using Prebid Server, you also need to configure your server-to-server bidder adapters. See [Getting Started with Prebid Server](/overview/prebid-server-overview.html). - -### Examples - -This section contains working examples of instream and outstream video ads for various players. - -### Using client-side adapters - -#### Instream -+ [Akamai AMP]({{site.github.url}}/examples/video/instream/akamai/pb-ve-amp.html) -+ [Brid]({{site.github.url}}/examples/video/instream/brid/pb-ve-brid.html) -+ [Brightcove]({{site.github.url}}/examples/video/instream/brightcove/pb-ve-brightcove.html) -+ [Flowplayer]({{site.github.url}}/examples/video/instream/flowplayer/pb-ve-flowplayer.html) -+ [JWPlayer - Platform]({{site.github.url}}/examples/video/instream/jwplayer/pb-ve-jwplayer-platform.html) -+ [JWPlayer - Hosted]({{site.github.url}}/examples/video/instream/jwplayer/pb-ve-jwplayer-hosted.html) -+ [Kaltura]({{site.github.url}}/examples/video/instream/kaltura/pb-ve-kaltura.html) -+ [Ooyala]({{site.github.url}}/examples/video/instream/ooyala/pb-ve-ooyala.html) -+ [VideoJS]({{site.github.url}}/examples/video/instream/videojs/pb-ve-videojs.html) - -#### Outstream - -+ [Outstream with Google Ad Manager]({{site.github.url}}/examples/video/outstream/pb-ve-outstream-dfp.html) -+ [Outstream without an Ad Server]({{site.github.url}}/examples/video/outstream/pb-ve-outstream-no-server.html) - -### Using Prebid Server - -+ [Brid]({{site.baseurl}}/examples/video/server/brid/pbs-ve-brid.html) -+ [JW Player - Platform]({{site.baseurl}}/examples/video/server/jwplayer/pbs-ve-jwplayer-platform.html) -+ [JW Player - Hosted]({{site.baseurl}}/examples/video/server/jwplayer/pbs-ve-jwplayer-hosted.html) -+ [Kaltura]({{site.baseurl}}/examples/video/server/kaltura/pbs-ve-kaltura.html) -+ [Ooyala]({{site.baseurl}}/examples/video/server/ooyala/pbs-ve-ooyala.html) -+ [VideoJS]({{site.baseurl}}/examples/video/server/videojs/pbs-ve-videojs.html) +#### Integrating on your own +If you prefer to fully own the integration between Prebid and Video, you can follow these [instructions]({{site.github.url}}/prebid-video/video-integrating-solo.html). ## Further Reading diff --git a/prebid-video/video-integrating-solo.md b/prebid-video/video-integrating-solo.md new file mode 100644 index 0000000000..6a7f370a19 --- /dev/null +++ b/prebid-video/video-integrating-solo.md @@ -0,0 +1,126 @@ +--- +layout: page_v2 +title: Integrating Prebid.js with video on your own +description: How to support video in Prebid with your own code +pid: 1 +sidebarType: 4 +--- + +# Integrating Prebid.js with video on your own + +## Define Prebid Ad Units + +Setting up Prebid ad units is almost the same whether you’re working with instream video ads or outstream. The primary difference is specifying the type of video ad (instream or outstream), which you do in the mediaTypes.video.context field: + +``` + var adUnit1 = { + code: 'videoAdUnit', + mediaTypes: { + video: { + context: 'instream', //or 'outstream' + playerSize: [640, 480], + mimes: ['video/mp4'], // required for Prebid Server + protocols: [1, 2, 3, 4, 5, 6, 7, 8], + playbackmethod: [2], + skip: 1 + } +``` + +The mediaTypes.video.playerSize field is where you define the player size that will be passed to demand partners. + +
+ Prebid Server +

If you’re using Prebid Server, you must also include the mediaTypes.video.mimes field, as this is required by OpenRTB.

+
+ +For full details on video ad unit parameters, see [Ad Unit Reference for Video]({{site.baseurl}}/dev-docs/adunit-reference.html#adunitmediatypesvideo) + +In your ad unit you also need to define your list of bidders. For example, including AppNexus as a bidder would look something like this: + +``` + var adUnit1 = { + ... + bids: [{ + bidder: 'appnexus', + params: { + placementId: '123456789', + } + }] +``` + +The parameters differ depending on which bidder you’re including. For a list of parameters for each bidder, see [Bidders’ Params]({{site.github.url}}/dev-docs/bidders.html). + +For full details on creating instream video ad units, see [Show Video Ads with Google Ad Manager – Create Ad Unit]({{site.github.url}}/dev-docs/show-video-with-a-dfp-video-tag.html#create-a-video-ad-unit). + +For full details on creating outstream video ad units, see [Show Outstream Video Ads – Create Ad Unit]({{site.github.url}}/dev-docs/show-outstream-video-ads.html#step-1-set-up-ad-units-with-the-video-media-type-and-outstream-context). + +## Configuration + +After you’ve defined your ad units, you can continue with the rest of your configuration. In +most cases for video, the first step will be to define where the VAST XML coming back in the bids +will be stored. Some bidders have you covered here -- the VAST is stored on their servers. But +many bidders don't have their own server-side cache. + +{: .alert.alert-success :} +Video players expect that the response from the ad server will be a URL that points to somewhere +on the internet that stores the video ad creative. This URL can't point to the browser, +so Prebid.js will send bid VAST XML out to a cache so it can be displayed if it wins in the ad server. + +Configuring the video cache is done with [`setConfig`](/dev-docs/publisher-api-reference/setConfig.html#setConfig-vast-cache): + +``` + pbjs.setConfig({ + cache: { + url: 'https://prebid.adnxs.com/pbc/v1/cache' + /* Or whatever your preferred video cache URL is */ + } + }); +``` + + +And this is where setups for instream and outstream diverge. Please follow one of these links: + +- Instream: [Show Video Ads with Google Ad Manager]({{site.github.url}}/dev-docs/show-video-with-a-dfp-video-tag.html) +- Outstream: [Show Outstream Video Ads]({{site.github.url}}/dev-docs/show-outstream-video-ads.html) + +Be sure to note the setting for price granularity. You might need to set up a custom price granularity. (See “Custom CPM Bucket Sizing” under [Price Granularity](/dev-docs/publisher-api-reference/setConfig.html#setConfig-Price-Granularity). Or, if you’re monetizing both banner and video inventory with Prebid, you might need to define format-specific price granularity settings through [mediaTypePriceGranularity](/dev-docs/publisher-api-reference/setConfig.html#setConfig-MediaType-Price-Granularity). + +{: .alert.alert-info :} +**Prebid Server** If you’re using Prebid Server, you also need to configure your server-to-server bidder adapters. See [Getting Started with Prebid Server](/overview/prebid-server-overview.html). + +## Examples + +This section contains working examples of instream and outstream video ads for various players. + +## Using client-side adapters + +### Instream ++ [Akamai AMP]({{site.github.url}}/examples/video/instream/akamai/pb-ve-amp.html) ++ [Brid]({{site.github.url}}/examples/video/instream/brid/pb-ve-brid.html) ++ [Brightcove]({{site.github.url}}/examples/video/instream/brightcove/pb-ve-brightcove.html) ++ [Flowplayer]({{site.github.url}}/examples/video/instream/flowplayer/pb-ve-flowplayer.html) ++ [JWPlayer - Platform]({{site.github.url}}/examples/video/instream/jwplayer/pb-ve-jwplayer-platform.html) ++ [JWPlayer - Hosted]({{site.github.url}}/examples/video/instream/jwplayer/pb-ve-jwplayer-hosted.html) ++ [Kaltura]({{site.github.url}}/examples/video/instream/kaltura/pb-ve-kaltura.html) ++ [Ooyala]({{site.github.url}}/examples/video/instream/ooyala/pb-ve-ooyala.html) ++ [VideoJS]({{site.github.url}}/examples/video/instream/videojs/pb-ve-videojs.html) + +### Outstream + ++ [Outstream with Google Ad Manager]({{site.github.url}}/examples/video/outstream/pb-ve-outstream-dfp.html) ++ [Outstream without an Ad Server]({{site.github.url}}/examples/video/outstream/pb-ve-outstream-no-server.html) + +## Using Prebid Server + ++ [Brid]({{site.baseurl}}/examples/video/server/brid/pbs-ve-brid.html) ++ [JW Player - Platform]({{site.baseurl}}/examples/video/server/jwplayer/pbs-ve-jwplayer-platform.html) ++ [JW Player - Hosted]({{site.baseurl}}/examples/video/server/jwplayer/pbs-ve-jwplayer-hosted.html) ++ [Kaltura]({{site.baseurl}}/examples/video/server/kaltura/pbs-ve-kaltura.html) ++ [Ooyala]({{site.baseurl}}/examples/video/server/ooyala/pbs-ve-ooyala.html) ++ [VideoJS]({{site.baseurl}}/examples/video/server/videojs/pbs-ve-videojs.html) + + +# Further Reading + +- [Prebid.js for Video Overview]({{site.github.url}}/prebid-video/video-overview.html) +- [What is Prebid?]({{site.github.url}}/overview/intro.html) diff --git a/prebid-video/video-module.md b/prebid-video/video-module.md new file mode 100644 index 0000000000..c6884ad33a --- /dev/null +++ b/prebid-video/video-module.md @@ -0,0 +1,576 @@ +--- +layout: page_v2 +title: Prebid Video Module +description: How to use the Video Module to integrate Prebid with Video +pid: 1 +sidebarType: 4 +--- + +# The Video Module + +The Prebid Video Module allows Prebid to directly integrate with a Video Player. + +The Video Module will allow Prebid.js to automatically: +- render bids in the desired video player +- mark used bids as won +- trigger player and media events +- fill the oRTB Video Impression and Content params in the bid request + +## Publishers + +Publishers benefit the most from the Video Module since it allows integrating with a Video Player by simply configuring Prebid. + +### Setting up + +{: .alert.alert-warning :} +The Video Module does not load the Video Player source files on the page. The publisher must have the Video Player's build on the page. + +#### Include submodule in build + +The first step is to include the submodules for the Video Players that you will be integrating with in your build. + +{% highlight bash %} +gulp build --modules=jwplayerVideoProvider,bidAdapter1,bidAdapter2 +{% endhighlight %} + +The following Video Players are currently supported: + +{: .table .table-bordered .table-striped } +| Video Player | Submodule Name | Vendor Code | +|--------------|----------------|-------------| +| [JW Player](https://www.jwplayer.com/) | jwplayerVideoProvider | 1 | +| [video.js](https://videojs.com/) | videojsVideoProvider | 2 | + +Not seeing your desired video player ? Learn how to add support by reading our [contribution guide](#Video-Module-Contributing) + +Optionally, if you are using an Ad Server, you can configure the Video Module to integrate with it. The following Ad Servers are currently supported: + +{: .table .table-bordered .table-striped } +| Ad Server | Module Name | Vendor Code | +|--------------|----------------|-------------| +| [Google Ad Manager](https://admanager.google.com/) | dfpAdServerVideo | 'gam' | + +{: .alert.alert-warning :} +**Note:** You must include the Ad Server's module in your build. + +#### Configure Prebid + +To register a video player with Prebid, you must use `setConfig` to set a `video` config compliant with the structure described in the [setConfig reference]({{site.baseurl}}/dev-docs/publisher-api-reference/setConfig.html#video-module). + +#### Configure Ad Units + +In order for Prebid to know which Ad Unit relates to which Video Player, you must include a `video` configuration in your Ad Unit. This allows Prebid to render the ad in the proper Video Player and obtain the Ortb data from the Video Player that will render the ad. +For the list of properties in the `video` object of the ad unit please visit the [adUnit.video reference]({{site.baseurl}}/dev-docs/adunit-reference.html#adUnit.video). + +### Features for Publishers + +Integrating with the Video Module gives publishers access to the following features + +#### Render ads + +Prebid can load the ad directly into the player when the auction is complete. +This feature happens automatically as long as you do **not** define a `bidsBackHandler` when calling `requestBids`. + +
+ +#### Events + +Media, ad and Player events are added when using the Video Module. +The event payload includes metadata which can be used for analytics, error handling, and customizing your integration. + +{: .table .table-bordered .table-striped } +| Event Constant | Event String | Description | +|----------------|--------------|-------------| +| SETUP_COMPLETE | 'video_setupComplete' | Fired when the player is instantiated and the integration is complete. At this point the API is ready to be used. | +| SETUP_FAILED | 'video_setupFailed' | Fired when the integration was unsuccessful. | +| DESTROYED | 'video_destroyed' | Fired when the player instance has been destroyed. | +| AD_REQUEST | 'video_adRequest' | Fired when the player is asked to load an ad. | +| AD_BREAK_START | 'video_adBreakStart' | Fired when an ad break begins. An ad break consists of an ad, or a sequence of subsequent ads. | +| AD_LOADED | 'video_adLoaded' | Fired when the player has finished loading the ad's VAST response. | +| AD_STARTED | 'video_adStarted' | Fired when the ad playback has started. | +| AD_IMPRESSION | 'video_adImpression' | Fired when an ad has been played for 2 consecutive seconds while the player is at least 50% viewable, as defined by the IAB standards for video ad impressions. | +| AD_PLAY | 'video_adPlay' | Fired when ad playback starts and is resumed after a pause. | +| AD_TIME | 'video_adTime' | Fired as the ad playback progresses. Frequency depends on the player. | +| AD_PAUSE | 'video_adPause' | Fired when the ad is paused. | +| AD_CLICK | 'video_adClick' | Fired when the ad is clicked or tapped. | +| AD_SKIPPED | 'video_adSkipped' | Fired when the ad is skipped. | +| AD_ERROR | 'video_adError' | Fired when an error occurred while attempting to load or render the ad. | +| AD_COMPLETE | 'video_adComplete' | Fired when the ad has reached its end. | +| AD_BREAK_END | 'video_adBreakEnd' | Fired when the sequence of ads in the break has ended. | +| PLAYLIST | 'video_playlist' | Fired when a media playlist has been loaded into the player. | +| PLAYBACK_REQUEST | 'video_playbackRequest' | Fired when an attempt to start the media playback has been made i.e. the viewer has tapped the play icon. | +| AUTOSTART_BLOCKED | 'video_autostartBlocked' | Fired when autostart has been prevented. Generally, autostart is prevented by the browser. | +| PLAY_ATTEMPT_FAILED | 'video_playAttemptFailed' | Fired when the user's attempt to begin playback is unsuccessful. | +| CONTENT_LOADED | 'video_contentLoaded' | Fired when the content media is loaded into the player. | +| PLAY | 'video_play' | Fired when the content playback begins or is resumed. | +| PAUSE | 'video_pause' | Fired when the content playback is paused. | +| BUFFER | 'video_buffer' | Fired when the player enters a buffer state. Usually caused by a delay in loading video segments to continue playback. | +| TIME | 'video_time' | Fired as the content playback progresses. Frequency depends on the player. | +| SEEK_START | 'video_seekStart' | Fired when the viewer begins seeking in content. | +| SEEK_END | 'video_seekEnd' | Fired when the viewer has finished seeking in the content. | +| MUTE | 'video_mute' | Fired when the player is muted. | +| VOLUME | 'video_volume' | Fired when the player's volume has changed. | +| RENDITION_UPDATE | 'video_renditionUpdate' | Fired when a change occurred in the video's encoded width, encoded height, reported video bitrate, reported audio bitrate or video framerate. | +| ERROR | 'video_error' | Fired when a player experiences an unrecoverable playback error while playing or attempting to play content. | +| COMPLETE | 'video_complete' | Fired when a media content has reached its end. | +| PLAYLIST_COMPLETE | 'video_playlistComplete' | Fired when the last piece of content in a media playlist has ended. | +| FULLSCREEN | 'video_fullscreen' | Fired when the player enters or exits fullscreen mode. | +| PLAYER_RESIZE | 'video_playerResize' | Fired when the player's size is modified. | +| VIEWABLE | 'video_viewable' | Fired when the player's viewability is changed. Viewability is a percentage of the player's size currently in view. The granularity at which this event is triggered depends on the player. | +| CAST | 'video_cast' | Fired when casting to an external device begins or ends. | +| AUCTION_AD_LOAD_ATTEMPT | 'video_auctionAdLoadAttempt' | Fired when Prebid attempts to load the winning ad from a Prebid auction into the player. | +| AUCTION_AD_LOAD_ABORT | 'video_auctionAdLoadAbort' | Fired when the attempt to load the winning ad from a Prebid auction into the player is prevented. | +| BID_IMPRESSION | 'video_bidImpression' | Fired when the ad from a bid resulted in an impression. | +| BID_ERROR | 'video_bidError' | Fired when the ad from a bid resulted in an error. | + +##### Event params + +All Video Module events include a `divId` and `type` param in the payload by default. +The `divId` is the div id string of the player emitting the event; it can be used as an identifier. The `type` is the string name of the event. +The remaining Payload params are listed in the following: + +###### SETUP_COMPLETE + +{: .table .table-bordered .table-striped } +| argument name | type | description | +| playerVersion | string | The version of the player on the page | +| viewable | boolean | Is the player currently viewable? | +| viewabilityPercentage | number | The percentage of the video that is currently viewable on the user's screen. | +| mute | boolean | Whether or not the player is currently muted. | +| volumePercentage | number | The volume of the player, as a percentage | + +###### SETUP_FAILED + +{: .table .table-bordered .table-striped } +| argument name | type | description | +| playerVersion | string | The version of the player on the page | +| errorCode | number | The identifier of the error preventing the media from rendering | +| errorMessage | string | Developer friendly description of the reason the error occurred. | +| sourceError | object | The underlying root Error which prevented the playback. | + +###### DESTROYED +No additional params. + +###### AD_REQUEST + +{: .table .table-bordered .table-striped } +| argument name | type | description | +| adTagUrl | string | The URL for the ad tag associated with the given ad event | + +###### AD_BREAK_START + +{: .table .table-bordered .table-striped } +| argument name | type | description | +| offset | string | Scheduled position in the video for the ad to play. For mid-rolls, will be the position in seconds as string. Other options: 'pre' (pre-roll), 'post' (post-roll), 'api' (ad was not scheduled) | + +###### AD_LOADED + +{: .table .table-bordered .table-striped } +| argument name | type | description | +| adTagUrl | string | The URL for the ad tag associated with the given ad event | +| offset | string | Scheduled position in the video for the ad to play. For mid-rolls, will be the position in seconds as string. Other options: 'pre' (pre-roll), 'post' (post-roll), 'api' (ad was not scheduled) | +| loadTime | number | Time the ad took to load in milliseconds | +| vastAdId | string | The ID given to the ad within the ad tag's XML. Nullable when absent from the VAST xml. | +| adDescription | string | Description of the ad pulled from the ad tag's XML. Nullable when absent from the VAST xml. | +| adServer | string | Ad server used (e.g. dart or mediamind) from the vast tag. Nullable when absent from the VAST xml. | +| adTitle | string | Title of the ad pulled from the ad tag's XML. Nullable when absent from the VAST xml. | +| advertiserId | string | Optional identifier for the advertiser, provided by the ad server. Nullable when absent from the VAST xml. | +| advertiserName | string | Name of the advertiser as defined by the ad serving party, from the vast XML. Nullable when absent from the VAST xml. | +| dealId | string | The ID of the Ads deal. Generally relates to Direct Sold Ad Campaigns. Nullable when absent from the VAST xml. | +| linear | boolean | Is the ad linear or not? | +| vastVersion | string | Version of VAST being reported from the tag | +| creativeUrl | string | The URL representing the VPAID or MP4 ad that is run | +| adId | string | Unique Ad ID - refers to the 'attribute' of the node within the VAST. Nullable when absent from the VAST xml. | +| universalAdId | string | Unique identifier for an ad in VAST4. Nullable when absent from the VAST xml. | +| creativeId | string | Ad server's unique ID for the creative pulled from the ad tag's XML. Should be used to specify the ad server’s unique identifier as opposed to the Universal Ad Id which is used for maintaining a creative id for the ad across multiple systems. Nullable when absent from the VAST xml. | +| creativeType | string | The MIME type of the ad creative currently being displayed | +| redirectUrl | string | the url to which the viewer is being redirected after clicking the ad. Nullable when absent from the VAST xml. | +| adPlacementType | number | The video placements per IAB guidelines. Enum list: In-Stream: 1, In-Banner: 2, In-Article: 3, In-Feed: 4, Interstitial/Slider/Floating: 5 | +| waterfallIndex | number | Index of the current item in the ad waterfall | +| waterfallCount | number | The count of items in a given ad waterfall | +| adPodCount | number | the total number of ads in the pod | +| adPodIndex | number | The index of the currently playing ad within an ad pod | +| wrapperAdIds | array[string] | Ad IDs of the VAST Wrappers that were loaded while loading the Ad tag. The list returned starts at the inline ad (innermost) and traverses to the outermost wrapper ad. An empty array is returned if there are no wrapper ads. | + +###### AD_STARTED + +{: .table .table-bordered .table-striped } +| argument name | type | description | +| adTagUrl | string | The URL for the ad tag associated with the given ad event | +| offset | string | Scheduled position in the video for the ad to play. For mid-rolls, will be the position in seconds as string. Other options: 'pre' (pre-roll), 'post' (post-roll), 'api' (ad was not scheduled) | +| loadTime | number | Time the ad took to load in milliseconds | +| vastAdId | string | The ID given to the ad within the ad tag's XML. Nullable when absent from the VAST xml. | +| adDescription | string | Description of the ad pulled from the ad tag's XML. Nullable when absent from the VAST xml. | +| adServer | string | Ad server used (e.g. dart or mediamind) from the vast tag. Nullable when absent from the VAST xml. | +| adTitle | string | Title of the ad pulled from the ad tag's XML. Nullable when absent from the VAST xml. | +| advertiserId | string | Optional identifier for the advertiser, provided by the ad server. Nullable when absent from the VAST xml. | +| advertiserName | string | Name of the advertiser as defined by the ad serving party, from the vast XML. Nullable when absent from the VAST xml. | +| dealId | string | The ID of the Ads deal. Generally relates to Direct Sold Ad Campaigns. Nullable when absent from the VAST xml. | +| linear | boolean | Is the ad linear or not? | +| vastVersion | string | Version of VAST being reported from the tag | +| creativeUrl | string | The URL representing the VPAID or MP4 ad that is run | +| adId | string | Unique Ad ID - refers to the 'attribute' of the node within the VAST. Nullable when absent from the VAST xml. | +| universalAdId | string | Unique identifier for an ad in VAST4. Nullable when absent from the VAST xml. | +| creativeId | string | Ad server's unique ID for the creative pulled from the ad tag's XML. Should be used to specify the ad server’s unique identifier as opposed to the Universal Ad Id which is used for maintaining a creative id for the ad across multiple systems. Nullable when absent from the VAST xml. | +| creativeType | string | The MIME type of the ad creative currently being displayed | +| redirectUrl | string | the url to which the viewer is being redirected after clicking the ad. Nullable when absent from the VAST xml. | +| adPlacementType | number | The video placements per IAB guidelines. Enum list: In-Stream: 1, In-Banner: 2, In-Article: 3, In-Feed: 4, Interstitial/Slider/Floating: 5 | +| waterfallIndex | number | Index of the current item in the ad waterfall | +| waterfallCount | number | The count of items in a given ad waterfall | +| adPodCount | number | the total number of ads in the pod | +| adPodIndex | number | The index of the currently playing ad within an ad pod | +| wrapperAdIds | array[string] | Ad IDs of the VAST Wrappers that were loaded while loading the Ad tag. The list returned starts at the inline ad (innermost) and traverses to the outermost wrapper ad. An empty array is returned if there are no wrapper ads. | + + + +###### AD_IMPRESSION + +{: .table .table-bordered .table-striped } +| argument name | type | description | +| adTagUrl | string | The URL for the ad tag associated with the given ad event | +| offset | string | Scheduled position in the video for the ad to play. For mid-rolls, will be the position in seconds as string. Other options: 'pre' (pre-roll), 'post' (post-roll), 'api' (ad was not scheduled) | +| loadTime | number | Time the ad took to load in milliseconds | +| vastAdId | string | The ID given to the ad within the ad tag's XML. Nullable when absent from the VAST xml. | +| adDescription | string | Description of the ad pulled from the ad tag's XML. Nullable when absent from the VAST xml. | +| adServer | string | Ad server used (e.g. dart or mediamind) from the vast tag. Nullable when absent from the VAST xml. | +| adTitle | string | Title of the ad pulled from the ad tag's XML. Nullable when absent from the VAST xml. | +| advertiserId | string | Optional identifier for the advertiser, provided by the ad server. Nullable when absent from the VAST xml. | +| advertiserName | string | Name of the advertiser as defined by the ad serving party, from the vast XML. Nullable when absent from the VAST xml. | +| dealId | string | The ID of the Ads deal. Generally relates to Direct Sold Ad Campaigns. Nullable when absent from the VAST xml. | +| linear | boolean | Is the ad linear or not? | +| vastVersion | string | Version of VAST being reported from the tag | +| creativeUrl | string | The URL representing the VPAID or MP4 ad that is run | +| adId | string | Unique Ad ID - refers to the 'attribute' of the node within the VAST. Nullable when absent from the VAST xml. | +| universalAdId | string | Unique identifier for an ad in VAST4. Nullable when absent from the VAST xml. | +| creativeId | string | Ad server's unique ID for the creative pulled from the ad tag's XML. Should be used to specify the ad server’s unique identifier as opposed to the Universal Ad Id which is used for maintaining a creative id for the ad across multiple systems. Nullable when absent from the VAST xml. | +| creativeType | string | The MIME type of the ad creative currently being displayed | +| redirectUrl | string | the url to which the viewer is being redirected after clicking the ad. Nullable when absent from the VAST xml. | +| adPlacementType | number | The video placements per IAB guidelines. Enum list: In-Stream: 1, In-Banner: 2, In-Article: 3, In-Feed: 4, Interstitial/Slider/Floating: 5 | +| waterfallIndex | number | Index of the current item in the ad waterfall | +| waterfallCount | number | The count of items in a given ad waterfall | +| adPodCount | number | the total number of ads in the pod | +| adPodIndex | number | The index of the currently playing ad within an ad pod | +| wrapperAdIds | array[string] | Ad IDs of the VAST Wrappers that were loaded while loading the Ad tag. The list returned starts at the inline ad (innermost) and traverses to the outermost wrapper ad. An empty array is returned if there are no wrapper ads. | +| time | number | The playback time in the ad when the event occurs, in seconds. | +| duration | number | Total duration of an ad in seconds | + +###### AD_PLAY + +{: .table .table-bordered .table-striped } +| argument name | type | description | +| adTagUrl | string | The URL for the ad tag associated with the given ad event | + +###### AD_TIME + +{: .table .table-bordered .table-striped } +| argument name | type | description | +| adTagUrl | string | The URL for the ad tag associated with the given ad event | +| time | number | The current poisition in the ad timeline | +| duration | number | Total duration of an ad in seconds | + +###### AD_PAUSE + +{: .table .table-bordered .table-striped } +| argument name | type | description | +| adTagUrl | string | The URL for the ad tag associated with the given ad event | + +###### AD_CLICK + +{: .table .table-bordered .table-striped } +| argument name | type | description | +| adTagUrl | string | The URL for the ad tag associated with the given ad event | +| offset | string | Scheduled position in the video for the ad to play. For mid-rolls, will be the position in seconds as string. Other options: 'pre' (pre-roll), 'post' (post-roll), 'api' (ad was not scheduled) | +| loadTime | number | Time the ad took to load in milliseconds | +| vastAdId | string | The ID given to the ad within the ad tag's XML. Nullable when absent from the VAST xml. | +| adDescription | string | Description of the ad pulled from the ad tag's XML. Nullable when absent from the VAST xml. | +| adServer | string | Ad server used (e.g. dart or mediamind) from the vast tag. Nullable when absent from the VAST xml. | +| adTitle | string | Title of the ad pulled from the ad tag's XML. Nullable when absent from the VAST xml. | +| advertiserId | string | Optional identifier for the advertiser, provided by the ad server. Nullable when absent from the VAST xml. | +| advertiserName | string | Name of the advertiser as defined by the ad serving party, from the vast XML. Nullable when absent from the VAST xml. | +| dealId | string | The ID of the Ads deal. Generally relates to Direct Sold Ad Campaigns. Nullable when absent from the VAST xml. | +| linear | boolean | Is the ad linear or not? | +| vastVersion | string | Version of VAST being reported from the tag | +| creativeUrl | string | The URL representing the VPAID or MP4 ad that is run | +| adId | string | Unique Ad ID - refers to the 'attribute' of the node within the VAST. Nullable when absent from the VAST xml. | +| universalAdId | string | Unique identifier for an ad in VAST4. Nullable when absent from the VAST xml. | +| creativeId | string | Ad server's unique ID for the creative pulled from the ad tag's XML. Should be used to specify the ad server’s unique identifier as opposed to the Universal Ad Id which is used for maintaining a creative id for the ad across multiple systems. Nullable when absent from the VAST xml. | +| creativeType | string | The MIME type of the ad creative currently being displayed | +| redirectUrl | string | the url to which the viewer is being redirected after clicking the ad. Nullable when absent from the VAST xml. | +| adPlacementType | number | The video placements per IAB guidelines. Enum list: In-Stream: 1, In-Banner: 2, In-Article: 3, In-Feed: 4, Interstitial/Slider/Floating: 5 | +| waterfallIndex | number | Index of the current item in the ad waterfall | +| waterfallCount | number | The count of items in a given ad waterfall | +| adPodCount | number | the total number of ads in the pod | +| adPodIndex | number | The index of the currently playing ad within an ad pod | +| wrapperAdIds | array[string] | Ad IDs of the VAST Wrappers that were loaded while loading the Ad tag. The list returned starts at the inline ad (innermost) and traverses to the outermost wrapper ad. An empty array is returned if there are no wrapper ads. | +| time | number | The playback time in the ad when the event occurs, in seconds. | +| duration | number | Total duration of an ad in seconds | + +###### AD_SKIPPED + +{: .table .table-bordered .table-striped } +| argument name | type | description | +| time | number | The playback time in the ad when the event occurs, in seconds. | +| duration | number | Total duration of an ad in seconds | + + + +###### AD_ERROR + +{: .table .table-bordered .table-striped } +| argument name | type | description | +| playerErrorCode | number | The ad error code from the Player’s internal spec. | +| vastErrorCode | number | The error code for the VAST response that is returned from the request, as defined in the VAST spec. | +| errorMessage | string | Developer friendly description of the reason the error occurred. | +| sourceError | object | The underlying root Error which prevented the playback. | +| adTagUrl | string | The URL for the ad tag associated with the given ad event | +| offset | string | Scheduled position in the video for the ad to play. For mid-rolls, will be the position in seconds as string. Other options: 'pre' (pre-roll), 'post' (post-roll), 'api' (ad was not scheduled) | +| loadTime | number | Time the ad took to load in milliseconds | +| vastAdId | string | The ID given to the ad within the ad tag's XML. Nullable when absent from the VAST xml. | +| adDescription | string | Description of the ad pulled from the ad tag's XML. Nullable when absent from the VAST xml. | +| adServer | string | Ad server used (e.g. dart or mediamind) from the vast tag. Nullable when absent from the VAST xml. | +| adTitle | string | Title of the ad pulled from the ad tag's XML. Nullable when absent from the VAST xml. | +| advertiserId | string | Optional identifier for the advertiser, provided by the ad server. Nullable when absent from the VAST xml. | +| advertiserName | string | Name of the advertiser as defined by the ad serving party, from the vast XML. Nullable when absent from the VAST xml. | +| dealId | string | The ID of the Ads deal. Generally relates to Direct Sold Ad Campaigns. Nullable when absent from the VAST xml. | +| linear | boolean | Is the ad linear or not? | +| vastVersion | string | Version of VAST being reported from the tag | +| creativeUrl | string | The URL representing the VPAID or MP4 ad that is run | +| adId | string | Unique Ad ID - refers to the 'attribute' of the node within the VAST. Nullable when absent from the VAST xml. | +| universalAdId | string | Unique identifier for an ad in VAST4. Nullable when absent from the VAST xml. | +| creativeId | string | Ad server's unique ID for the creative pulled from the ad tag's XML. Should be used to specify the ad server’s unique identifier as opposed to the Universal Ad Id which is used for maintaining a creative id for the ad across multiple systems. Nullable when absent from the VAST xml. | +| creativeType | string | The MIME type of the ad creative currently being displayed | +| redirectUrl | string | the url to which the viewer is being redirected after clicking the ad. Nullable when absent from the VAST xml. | +| adPlacementType | number | The video placements per IAB guidelines. Enum list: In-Stream: 1, In-Banner: 2, In-Article: 3, In-Feed: 4, Interstitial/Slider/Floating: 5 | +| waterfallIndex | number | Index of the current item in the ad waterfall | +| waterfallCount | number | The count of items in a given ad waterfall | +| adPodCount | number | the total number of ads in the pod | +| adPodIndex | number | The index of the currently playing ad within an ad pod | +| wrapperAdIds | array[string] | Ad IDs of the VAST Wrappers that were loaded while loading the Ad tag. The list returned starts at the inline ad (innermost) and traverses to the outermost wrapper ad. An empty array is returned if there are no wrapper ads. | +| time | number | The playback time in the ad when the event occurs, in seconds. | +| duration | number | Total duration of an ad in seconds | + +###### AD_COMPLETE + +{: .table .table-bordered .table-striped } +| argument name | type | description | +| adTagUrl | string | The URL for the ad tag associated with the given ad event | + +###### AD_BREAK_END + +{: .table .table-bordered .table-striped } +| argument name | type | description | +| offset | string | Scheduled position in the video for the ad to play. For mid-rolls, will be the position in seconds as string. Other options: 'pre' (pre-roll), 'post' (post-roll), 'api' (ad was not scheduled) | + +###### PLAYLIST + +{: .table .table-bordered .table-striped } +| argument name | type | description | +| playlistItemCount | number | The number of items in the current playlist | +| autostart | boolean | Whether or not the player is set to begin playing automatically. | + +###### PLAYBACK_REQUEST + +{: .table .table-bordered .table-striped } +| argument name | type | description | +| playReason | string | wWy the play attempt originated. Options: ‘Unknown’ (Unknown reason:we cannot tell), ‘Interaction’ (A viewer interacts with the UI), ‘Auto’ (Autoplay based on the configuration of the player - autoStart), ‘autoOnViewable’ (autoStart when viewable), ‘autoRepeat’ (media automatically restarted after completion, without any user interaction), ‘Api’ (caused by a call on the player’s API), ‘Internal’ (started because of an internal mechanism i.e. playlist progressed to a recommended item) | + +###### AUTOSTART_BLOCKED + +{: .table .table-bordered .table-striped } +| argument name | type | description | +| errorCode | number | The identifier of error preventing the media from rendering | +| errorMessage | string | Developer friendly description of the reason the error occurred. | +| sourceError | object | The underlying root Error which prevented the playback. | + +###### PLAY_ATTEMPT_FAILED + +{: .table .table-bordered .table-striped } +| argument name | type | description | +| playReason | string | Why the play attempt originated. Options: ‘Unknown’ (Unknown reason:we cannot tell), ‘Interaction’ (A viewer interacts with the UI), ‘Auto’ (Autoplay based on the configuration of the player - autoStart), ‘autoOnViewable’ (autoStart when viewable), ‘autoRepeat’ (media automatically restarted after completion, without any user interaction), ‘Api’ (caused by a call on the player’s API), ‘Internal’ (started because of an internal mechanism i.e. playlist progressed to a recommended item) | +| errorCode | number | The identifier of error preventing the media from rendering | +| errorMessage | string | Developer friendly description of the reason the error occurred. | +| sourceError | object | The underlying root Error which prevented the playback. | + +###### CONTENT_LOADED + +{: .table .table-bordered .table-striped } +| argument name | type | description | +| contentId | string | The unique identifier of the media item being rendered by the video player. Nullable when not provided by Publisher, or unknown. | +| contentUrl | string | The URL of the media source of the playlist item | +| title | string | The title of the content; not meant to be used as a unique identifier. Nullable when not provided by Publisher, or unknown. | +| description | string | The description of the content. Nullable when not provided by Publisher, or unknown. | +| playlistIndex | number | The currently playing media item's index in the playlist. | +| contentTags | array[string] | Customer media level tags describing the content. Nullable when not provided by Publisher, or unknown. | + +###### PLAY + +No additional params. + +###### PAUSE + +No additional params. + +###### BUFFER + +{: .table .table-bordered .table-striped } +| argument name | type | description | +| time | number | Playback position of the media in seconds | +| duration | number | Current media’s length in seconds | +| playbackMode | number | The current playback mode used by a given player. Enum list: vod: 0, live: 1, dvr: 2 | + +###### TIME + +{: .table .table-bordered .table-striped } +| argument name | type | description | +| position | number | Playback position of the media in seconds | +| duration | number | Current media’s length in seconds | + +###### SEEK_START + +{: .table .table-bordered .table-striped } +| argument name | type | description | +| position | number | Playback position of the media in seconds, when the seek begins | +| destination | number | Desired playback position of a seek action, in seconds | +| duration | number | Current media’s length in seconds | + +###### SEEK_END + +{: .table .table-bordered .table-striped } +| argument name | type | description | +| position | number | Playback position of the media in seconds, when the seek has ended | +| duration | number | Current media’s length in seconds | + +###### MUTE + +{: .table .table-bordered .table-striped } +| argument name | type | description | +| mute | boolean | Whether or not the player is currently muted. | + +###### VOLUME + +{: .table .table-bordered .table-striped } +| argument name | type | description | +| volumePercentage | number | The volume of the player, as a percentage | + +###### RENDITION_UPDATE + +{: .table .table-bordered .table-striped } +| argument name | type | description | +| videoReportedBitrate | number | The bitrate of the currently playing video in kbps as reported by the Adaptive Manifest. | +| audioReportedBitrate | number | The bitrate of the currently playing audio in kbps as reported by the Adaptive Manifest. | +| encodedVideoWidth | number | The encoded width in pixels of the currently playing video rendition. | +| encodedVideoHeight | number | The encoded height in pixels of the currently playing video rendition. | +| videoFramerate | number | The current rate of playback. For a video that is playing twice as fast as the default playback, the playbackRate value should be 2.00 | + +###### ERROR + +{: .table .table-bordered .table-striped } +| argument name | type | description | +| errorCode | number | The identifier of the error preventing the media from rendering | +| errorMessage | string | Developer friendly description of the reason the error occurred. | +| sourceError | object | The underlying root Error which prevented the playback. | + +###### COMPLETE + +No additional params. + +###### PLAYLIST_COMPLETE + +No additional params. + +###### FULLSCREEN + +{: .table .table-bordered .table-striped } +| argument name | type | description | +| fullscreen | boolean | Whether or not the player is currently in fullscreen | + +###### PLAYER_RESIZE + +{: .table .table-bordered .table-striped } +| argument name | type | description | +| height | number | The height of the player in pixels | +| width | number | The width of the player in pixels | + +###### VIEWABLE + +{: .table .table-bordered .table-striped } +| argument name | type | description | +| viewable | boolean | Is the player currently viewable? | +| viewabilityPercentage | number | The percentage of the video that is currently viewable on the user's screen. | + +###### CAST + +{: .table .table-bordered .table-striped } +| argument name | type | description | +| casting | boolean | Whether or not the current user is casting to a device | + +###### AUCTION_AD_LOAD_ATTEMPT + +{: .table .table-bordered .table-striped } +| argument name | type | description | +| adTagUrl | string | The URL for the ad tag associated with the given ad event | +| adUnitCode | string | Unique identifier that was used when creating the ad unit. | + +###### AUCTION_AD_LOAD_ABORT + +{: .table .table-bordered .table-striped } +| argument name | type | description | +| adUnitCode | string | Unique identifier that was used when creating the ad unit. | + +###### BID_IMPRESSION + +{: .table .table-bordered .table-striped } +| argument name | type | description | +| bid | object | Information about the Bid which resulted in the Ad Impression | +| adEvent | object | Event payload from the [Ad Impression](#ad-impression-params) | + +###### BID_ERROR + +{: .table .table-bordered .table-striped } +| argument name | type | description | +| bid | object | Information about the Bid which resulted in the Ad Error | +| adEvent | object | Event payload from the [Ad Error](#ad-error-params) | + +#### Bids marked as won + +When an impression or error from an ad originating from a winning bid occurs, the bid will be automatically marked as used. + +{: .alert.alert-warning :} +Limitations: the mechanism used to determine when an error occurred for an ad originating from a winning might fail at times when the ad server is GAM because of a limitation in GAM. + +#### Bid request Enrichment + +For your convenience, when an auction begins, the Video Module will update oRTB params in the auction for SSPs to consume and include in their bid requests. + +##### adUnit.mediaTypes.video + +The params in `adUnit.mediaTypes.video` are populated with information extracted from the player. Any param already filled by the publisher will remain unchanged. +Some params such as `battr`, `minduration`, `maxduration` are specific to a publisher's preferences and should therefore be populated by the Publisher. + +##### bidderRequest.ortb2.site.content + +The params in `bidderRequest.ortb2.site.content` are populated with information extracted from the video player. Any params already filled by the publisher will remain unchanged. +This feature can be disabled by setting `video.contentEnrichmentEnabled` to `false` in the Prebid config. +In the case where multiple video players are registered with the Video Module, the `bidderRequest.ortb2.site.content` params will be updated by the video player registered to the ad unit in the auction. If one of the Video Players is responsible for rendering the main content on the page, it may be appropriate for the `site.content` params to be populated with metadata from that player; in such case, you should populate `video.mainContentDivId` in the Prebid config with the video player's div id. | + +## SSPs + +Before bids are requested, the Video Module automatically enriches the auction. SSPs can benefit from this by reading from the proper params. +Given that the video player is the source of truth for most video params, SSPs and DSPs can rely on the accuracy of the information. + +### mediaTypes.video + +Before bids are requested, all ad units configured to be handled by the Video Module will be enriched. The adUnit's `mediaTypes.video` param will be populated automatically. +SSPs wishing to benefit from this enrichment should read from `mediaTypes.video`. + +### bidderRequest.ortb2.site.content + +Similarly, before bids are requested, the `bidderRequest.ortb2.site.content` param is populated in the `bidderRequest` argument of the `buildRequests` function with content metadata from the video player and its media. +SSPs wishing to benefit from this enrichment should read from `bidderRequest.ortb2.site.content`. + + + +## Contributing + +The Prebid Video Module acts as a simple Video interface which Prebid can connect to. In order for the Video Module to plug into a Video Player, a video submodule must be implemented. The Video Submodule acts as a bridge between the Video Module and the Video Player. +To add a submodule please follow the instructions in [How to add a video submodule]({{site.github.url}}/dev-docs/add-video-submodule.html). From 17ba0a5e1685184eae3e6819e10b37f22a2f2157 Mon Sep 17 00:00:00 2001 From: Jozef Bartek <31618107+jbartek25@users.noreply.github.com> Date: Fri, 28 Oct 2022 19:19:31 +0200 Subject: [PATCH 072/280] adding publisherId param (#4085) --- dev-docs/bidders/improvedigital.md | 1 + 1 file changed, 1 insertion(+) diff --git a/dev-docs/bidders/improvedigital.md b/dev-docs/bidders/improvedigital.md index 18f54bfeb2..abc496dbad 100755 --- a/dev-docs/bidders/improvedigital.md +++ b/dev-docs/bidders/improvedigital.md @@ -24,6 +24,7 @@ floors_supported: true | Name | Scope | Description | Example | Type | |----------------|----------|----------------------------------------------------------------------------------------------------------------------------|------------------------------------------------------------------------|-----------| | `placementId` | required | The placement ID from Improve Digital. | `1234567` | `integer` | +| `publisherId` | required | The publisher ID from Improve Digital. | `4567` | `integer` | | `keyValues` | optional | Contains one or more key-value pairings for key-value targeting | `{ testKey1: ['testValueA'], testKey2: ['testValueB', 'testValueC'] }` | `object` | | `bidFloor` | optional | Bid floor price | `0.01` | `float` | | `bidFloorCur` | optional | Bid floor price currency. Supported values: USD (default), EUR, GBP, AUD, DKK, SEK, CZK, CHF, NOK | `'USD'` | `string` | From d97c9f5adf63d662461a70c7439deaf9324dcd13 Mon Sep 17 00:00:00 2001 From: mjaworskiccx <50406214+mjaworskiccx@users.noreply.github.com> Date: Mon, 31 Oct 2022 12:42:49 +0100 Subject: [PATCH 073/280] Clickonometrics: add gvl_id, update param name (#4065) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit * add ccx params doc * Clickonometrics add gvl_id, update param name * Clickonometrics revert param name Co-authored-by: Piotr Koryśko --- dev-docs/bidders/ccx.md | 1 + 1 file changed, 1 insertion(+) diff --git a/dev-docs/bidders/ccx.md b/dev-docs/bidders/ccx.md index 895fc9036d..c830c93662 100644 --- a/dev-docs/bidders/ccx.md +++ b/dev-docs/bidders/ccx.md @@ -5,6 +5,7 @@ description: Prebid Clickonometrics Bidder Adaptor pbjs: true biddercode: ccx media_types: video +gvl_id: 773 gdpr_supported: true --- From f3b48021a84a2032f49d1d5b35719a2d9a02ced7 Mon Sep 17 00:00:00 2001 From: Demetrio Girardi Date: Mon, 31 Oct 2022 04:43:53 -0700 Subject: [PATCH 074/280] PBJS: document new return value from `requestBids` (#4073) --- .../publisher-api-reference/requestBids.md | 21 ++++++++++++++++--- 1 file changed, 18 insertions(+), 3 deletions(-) diff --git a/dev-docs/publisher-api-reference/requestBids.md b/dev-docs/publisher-api-reference/requestBids.md index 92ef42eb1c..7a306ec4ad 100644 --- a/dev-docs/publisher-api-reference/requestBids.md +++ b/dev-docs/publisher-api-reference/requestBids.md @@ -9,6 +9,9 @@ Request bids. When `adUnits` or `adUnitCodes` are not specified, request bids fo **Kind**: static method of pbjs API +**Returns**: a promise to an object `{bids, timedOut, auctionId}` - [see below](#result) + +**Parameters**: {: .table .table-bordered .table-striped } | Param | Scope | Type | Description | @@ -17,12 +20,25 @@ Request bids. When `adUnits` or `adUnitCodes` are not specified, request bids fo | requestObj.adUnitCodes | Optional | `Array of strings` | adUnit codes to request. Use this or `requestObj.adUnits`. Default to all `adUnitCodes` if empty. | | requestObj.adUnits | Optional | `Array of objects` | AdUnitObjects to request. Use this or `requestObj.adUnitCodes`. Default to all `adUnits` if empty. | | requestObj.timeout | Optional | `Integer` | Timeout for requesting the bids specified in milliseconds | -| requestObj.bidsBackHandler | Optional | `function` | Callback to execute when all the bid responses are back or the timeout hits. Callback will be passed three parameters, the [bidResponses](#module_pbjs.getBidResponses) themselves, a `timedOut` flag (true if any bidders timed out) and the `auctionId`. | +| requestObj.bidsBackHandler | Optional | `function` | Callback to execute when all the bid responses are back or the timeout hits. Callback will be passed 3 arguments - `bids`, `timedOut`, and `auctionId` - [see below](#result) | | requestObj.labels | Optional | `Array of strings` | Defines [labels](#labels) that may be matched on ad unit targeting conditions. | | requestObj.auctionId | Optional | `String` | Defines an auction ID to be used rather than having the system generate one. This can be useful if there are multiple wrappers on a page and a single auction ID is desired to tie them together in analytics. | | requestObj.ortb2 | Optional | `Object` | Additional [first-party data](/features/firstPartyData.html) to use for this auction only | -Example call + + + +**Result**: + +{: .table .table-bordered .table-stripped :} +| Param | Type | Description | +| --- | --- | --- | +| bids | Object | Bids received; see [getBidResponses](getBidResponses.html) for details | +| timedOut | Boolean | true if any bidder timed out | +| auctionId | String | the auction's ID | + +Example call: + ``` pbjs.requestBids({ bidsBackHandler: sendAdserverRequest, @@ -36,7 +52,6 @@ Example parameters sent to the bidsBackHandler: function sendAdserverRequest(bids, timedOut, auctionId) { // bids // {"test-div":{"bids":[{"bidderCode":"bidderA", ...}]}} - // See [getBidResponses function](#module_pbjs.getBidResponses) for details // timedOut=false // auctionId="130aad5e-eb1a-4b7d-8939-0663ba251887" ... From e227f868afa0edbc732f28e7f4bcd2413f7b673a Mon Sep 17 00:00:00 2001 From: Samuel Adu Date: Mon, 31 Oct 2022 11:44:38 +0000 Subject: [PATCH 075/280] ConnectID User ID module: Document extended configuration options (#4080) Co-authored-by: slimkrazy --- dev-docs/modules/userId.md | 51 +++++++++++++++++++++++++++++++++++--- 1 file changed, 47 insertions(+), 4 deletions(-) diff --git a/dev-docs/modules/userId.md b/dev-docs/modules/userId.md index b27fba399a..e29d7dcd44 100644 --- a/dev-docs/modules/userId.md +++ b/dev-docs/modules/userId.md @@ -760,9 +760,9 @@ pbjs.setConfig({ ### GrowthCode -[GrowthCode](https://growthcode.io/) offers scaled infrastructure-as-a-service -to empower independent publishers to harness data and take control of -identity and audience while rapidly aligning to industry changes and +[GrowthCode](https://growthcode.io/) offers scaled infrastructure-as-a-service +to empower independent publishers to harness data and take control of +identity and audience while rapidly aligning to industry changes and margin pressure. #### GrowthCode Configuration @@ -2374,7 +2374,8 @@ gulp build --modules=userId,connectIdSystem | name | Required | String | The name of this module. | `'connectId'` | | params | Required | Object | Container of all module params. || | params.pixelId | Required | Number | The Yahoo supplied publisher specific pixel Id | `8976` | -| params.he | Required | String | The SHA-256 hashed user email address |`'ed8ddbf5a171981db8ef938596ca297d5e3f84bcc280041c5880dba3baf9c1d4'`| +| params.he | Optional | String | The SHA-256 hashed user email address. One of either the `he` parameter or the `puid` parameter must be supplied. |`'ed8ddbf5a171981db8ef938596ca297d5e3f84bcc280041c5880dba3baf9c1d4'`| +| params.puid | Optional | String | The publisher-supplied user identifier. One of either the `he` parameter or the `puid` parameter must be supplied. | `"P-975484817"` | | storage | Required | Object | Defines where and for how long the results of the call to get a user ID will be stored. | | | storage.type | Required | String | Defines where the resolved user ID will be stored (either `'cookie'` or `'html5'` localstorage).| `'html5'` | | storage.name | Required | String | The name of the cookie or html5 localstorage where the resolved user ID will be stored. | `'connectId'` | @@ -2386,6 +2387,7 @@ gulp build --modules=userId,connectIdSystem #### Yahoo ConnectID Examples ``` +// [Sample #1]: Using a hashed email. pbjs.setConfig({ userSync: { userIds: [{ @@ -2404,6 +2406,47 @@ pbjs.setConfig({ }) ``` +``` +// [Sample #2]: Using a publisher-supplied user identifier. +pbjs.setConfig({ + userSync: { + userIds: [{ + name: "connectId", + params: { + pixelId: 8976, + puid: "P-975484817" + }, + storage: { + type: "html5", + name: "connectId", + expires: 15 + } + }] + } +}) +``` + +``` +// [Sample #3]: Using a hashed email and a publisher-supplied user identifier. +pbjs.setConfig({ + userSync: { + userIds: [{ + name: "connectId", + params: { + pixelId: 8976, + he: "ed8ddbf5a171981db8ef938596ca297d5e3f84bcc280041c5880dba3baf9c1d4", + puid: "P-975484817" + }, + storage: { + type: "html5", + name: "connectId", + expires: 15 + } + }] + } +}) +``` + ### GRAVITO ID by Gravito Ltd. Gravito ID, provided by [Gravito Ltd.](https://gravito.net), is ID for ad targeting by using 1st party cookie. From 2bf25fc4f454aac4786752a20263abbbb21df842 Mon Sep 17 00:00:00 2001 From: Veronika Solovei Date: Mon, 31 Oct 2022 04:46:58 -0700 Subject: [PATCH 076/280] Added new adapter builder parameter for PBS-Go, updated signatures and usages examples (#4083) Co-authored-by: vsolovei --- prebid-server/developers/add-new-bidder-go.md | 20 ++++++++++++------- 1 file changed, 13 insertions(+), 7 deletions(-) diff --git a/prebid-server/developers/add-new-bidder-go.md b/prebid-server/developers/add-new-bidder-go.md index fb72e529a6..3e66b4ca1c 100644 --- a/prebid-server/developers/add-new-bidder-go.md +++ b/prebid-server/developers/add-new-bidder-go.md @@ -468,7 +468,7 @@ type adapter struct { } // Builder builds a new instance of the Foo adapter for the given bidder with the given config. -func Builder(bidderName openrtb_ext.BidderName, config config.Adapter) (adapters.Bidder, error) { +func Builder(bidderName openrtb_ext.BidderName, config config.Adapter, server config.Server) (adapters.Bidder, error) { bidder := &adapter{ endpoint: config.Endpoint, } @@ -540,6 +540,8 @@ The second argument, `config`, is all the configuration values set for your adap - `config.Endpoint` is the base url of your bidding server and may be interpreted as either a literal address or as a templated macro to support dynamic paths. - `config.ExtraAdapterInfo` is an optional setting may be used for any other values your adapter may need, such as an application token or publisher allow/deny list. You may interpret this string however you like, although JSON is a common choice. +The third argument, `server`, is a set of host configs. It can be passed in two different ways. One way is to pass this info in the auction request itself at the path `ext.prebid.server` (i.e. `ext.prebid.server.datacenter`). The second way is to pass this info as a configuration data structure. + The `Builder` method is expected to return an error if either the `config.Endpoint` or the `config.ExtraAdapterInfo` values are invalid or cannot be parsed. Errors will be surfaced to the host during application startup as a fatal error.
@@ -551,7 +553,7 @@ type adapter struct { } // Builder builds a new instance of the Foo adapter for the given bidder with the given config. -func Builder(bidderName openrtb_ext.BidderName, config config.Adapter) (adapters.Bidder, error) { +func Builder(bidderName openrtb_ext.BidderName, config config.Adapter, server config.Server) (adapters.Bidder, error) { template, err := template.New("endpointTemplate").Parse(config.Endpoint) if err != nil { return nil, fmt.Errorf("unable to parse endpoint url template: %v", err) @@ -574,7 +576,7 @@ type extraInfo struct { } // Builder builds a new instance of the Foo adapter for the given bidder with the given config. -func Builder(bidderName openrtb_ext.BidderName, config config.Adapter) (adapters.Bidder, error) { +func Builder(bidderName openrtb_ext.BidderName, config config.Adapter, server config.Server) (adapters.Bidder, error) { info, err := parseExtraInfo(config.ExtraAdapterInfo) if err != nil { return nil, err @@ -947,7 +949,8 @@ import ( func TestJsonSamples(t *testing.T) { bidder, buildErr := Builder(openrtb_ext.Bidder{Bidder}, config.Adapter{ - Endpoint: "http://whatever.url"}) + Endpoint: "http://whatever.url"}, + config.Server{ExternalUrl: "http://hosturl.com", GvlID: 1, DataCenter: "2"}) if buildErr != nil { t.Fatalf("Builder returned unexpected error %v", buildErr) @@ -1018,7 +1021,8 @@ If your adapter supports template parsing, we recommend adding this failure test ```go func TestEndpointTemplateMalformed(t *testing.T) { _, buildErr := Builder(openrtb_ext.Bidder{Bidder}, config.Adapter{ - Endpoint: "{%raw%}{{Malformed}}{%endraw%}"}) + Endpoint: "{%raw%}{{Malformed}}{%endraw%}"}, + config.Server{ExternalUrl: "http://hosturl.com", GvlID: 1, DataCenter: "2"}) assert.Error(t, buildErr) } @@ -1031,7 +1035,8 @@ func TestBadConfig(t *testing.T) { _, buildErr := Builder(openrtb_ext.Bidder{Bidder}, config.Adapter{ Endpoint: `http://it.doesnt.matter/bid`, ExtraAdapterInfo: `{foo:42}`, - }) + }, + config.Server{ExternalUrl: "http://hosturl.com", GvlID: 1, DataCenter: "2"}) assert.Error(t, buildErr) } @@ -1040,7 +1045,8 @@ func TestEmptyConfig(t *testing.T) { bidder, buildErr := Builder(openrtb_ext.Bidder{Bidder}, config.Adapter{ Endpoint: `http://it.doesnt.matter/bid`, ExtraAdapterInfo: ``, - }) + }, + config.Server{ExternalUrl: "http://hosturl.com", GvlID: 1, DataCenter: "2"}) bidder{Bidder} := bidder.(*adapter) From 43f113f6c9228f5b6b56a54ed188037e77712fc0 Mon Sep 17 00:00:00 2001 From: product-aax <103228925+product-aax@users.noreply.github.com> Date: Mon, 31 Oct 2022 17:18:15 +0530 Subject: [PATCH 077/280] AAX Blockmeter RealTime Data Module Documentation (#4095) * AAX Blockmeter RealTime Data Module Documentation * Added disclosure: Rtd Provider module loads external code * Review Changes: Rephrased overview for the RTD module Co-authored-by: shubham.si --- dev-docs/modules/aaxBlockmeterRtdProvider.md | 90 ++++++++++++++++++++ 1 file changed, 90 insertions(+) create mode 100644 dev-docs/modules/aaxBlockmeterRtdProvider.md diff --git a/dev-docs/modules/aaxBlockmeterRtdProvider.md b/dev-docs/modules/aaxBlockmeterRtdProvider.md new file mode 100644 index 0000000000..61979cf054 --- /dev/null +++ b/dev-docs/modules/aaxBlockmeterRtdProvider.md @@ -0,0 +1,90 @@ +--- +layout: page_v2 +title: AAX Blockmeter Realtime Data Module +display_name: AAX Blockmeter +description: Measure the adblock traffic. +page_type: module +module_type: rtd +module_code : aaxBlockmeterRtdProvider +enable_download : true +vendor_specific: true +sidebarType : 1 +--- + +# AAX Blockmeter Realtime Data Module +{:.no_toc} + +* TOC +{:toc} + +## Overview + +The module enables publishers with an AAX relationship to measure traffic coming from visitors using adblockers. + +AAX can also help publishers monetize this traffic by allowing them to serve [acceptable ads](https://acceptableads.com/about/) to these adblock visitors and recover their lost revenue. [Reach out to us](https://www.aax.media/try-blockmeter/) to know more. + +{: .alert.alert-warning :} +Disclosure: This module loads external code that is not open source and has not been reviewed by Prebid.org. + +## Configuration + +This module is configured as part of the `realTimeData.dataProviders` object. + +{: .table .table-bordered .table-striped } +| Name | Scope | Description | Example | Type | +|------------|----------|----------------------------------------|---------------|----------| +| `name ` | required | Real time data module name | `'aaxBlockmeter'` | `string` | +| `params` | required | | | `Object` | +| `params.pub` | required | AAX to share pub ID, [Reach out to us](https://www.aax.media/try-blockmeter/) to know more! | `'AAX000000'` | `string` | +| `params.url ` | optional | AAX Blockmeter Script Url. Defaults to `'c.aaxads.com/aax.js?ver=1.2'` | `'c.aaxads.com/aax.js?ver=1.2'` | `string` | + +### Basic Example + +```javascript +pbjs.setConfig({ + realTimeData: { + dataProviders: [{ + name: 'aaxBlockmeter', + params: { + pub: 'AAX000000', + url: 'c.aaxads.com/aax.js?ver=1.2', + } + }] + } +}); +``` + +## Targeting sent to GAM + +For each prebid adUnit we pass the following key value to GAM by default + +| Google Slot Id | Prebid Adunit Code | Targeting Key | Targeting Value | +|:----------:|:--------------:|:---------------:|:---------------:| +|slotA| code-1 | `atk` | `code-1` | + +## Integration +To install the module, follow these instructions: + +### Step 1: Prepare the base Prebid file + +- **Option 1:** Use Prebid [Download](/download.html) page to build the prebid package. Ensure that you do check *AAX Blockmeter Realtime Module* module + +- **Option 2:** From the command line, run `gulp build --modules=aaxBlockmeterRtdProvider,rtdModule,...` + +### Step 2: Set configuration + +Enable AAX Blockmeter Real Time Module using `pbjs.setConfig` + +```javascript +pbjs.setConfig({ + realTimeData: { + dataProviders: [{ + name: 'aaxBlockmeter', + params: { + pub: 'AAX000000' + } + }] + } +}); +``` + From b11536c9eda0b7b12dc2c2d7388ba2c06a377d4a Mon Sep 17 00:00:00 2001 From: jdwieland8282 Date: Mon, 31 Oct 2022 05:53:25 -0600 Subject: [PATCH 078/280] add "delete" section describing new functionality (#4114) * add "delete" section describing new functionality * softening language --- dev-docs/modules/consentManagementUsp.md | 15 +++++++++++++++ 1 file changed, 15 insertions(+) diff --git a/dev-docs/modules/consentManagementUsp.md b/dev-docs/modules/consentManagementUsp.md index b1f7c26fe1..f42bf1cdb2 100644 --- a/dev-docs/modules/consentManagementUsp.md +++ b/dev-docs/modules/consentManagementUsp.md @@ -52,6 +52,21 @@ If the timeout period expires or an error from the USP-API is thrown, the auctio | 3) Has user opted-out of the sale of his or her personal information?| (N = No,Y = Yes,– = Not Applicable)| | 4) Publisher is a signatory to the IAB Limited Service Provider Agreement| (N = No,Y = Yes,– = Not Applicable)| +### Deletes + +As of January 1st 2023, CCPA will require that requests to "delete my personal information" (right to delete) must be propagated to all 3rd parties user data is being shared with. US Privacy Consent Management Module will support this feature in 7.23.0 and above. + +Prebid Modules that receive user data (bid adapters, analytics adapters), or set user data (UserId, RTD) may define a new method called `onDataDeletionRequest`. The US Privacy Consent Management Module will attach a `registerDeletion` event handler with the CMP, when triggered it will: + +The USP module attaches a 'registerDeletion' event handler with the CMP; when triggered, it will: +- invoke the methods above on all adapters +- delete all IDs from cookies/localStorage + +3rd parties can define the method like this: +- UserID submodules can define a method onDataDeletionRequest(config, idValue) +- Bid adapters can define a method spec.onDataDeletionRequest(bidderRequests) +- Analytics adapters can define a method onDataDeletionRequest() + ## Page Integration To utilize this module, software that provides the [USP-API](https://github.com/InteractiveAdvertisingBureau/USPrivacy/blob/master/CCPA/USP%20API.md) must to be implemented on the site to interact with the user and obtain their notice and opt-out status. From 2bd0c4da77167886142f2c98170c4bee547be5bc Mon Sep 17 00:00:00 2001 From: Demetrio Girardi Date: Mon, 31 Oct 2022 05:06:17 -0700 Subject: [PATCH 079/280] PBJS: document new `ttlBuffer` settings (#4097) Co-authored-by: Muki Seiler --- dev-docs/adunit-reference.md | 1 + dev-docs/publisher-api-reference/requestBids.md | 1 + dev-docs/publisher-api-reference/setConfig.md | 13 +++++++++++++ 3 files changed, 15 insertions(+) diff --git a/dev-docs/adunit-reference.md b/dev-docs/adunit-reference.md index 9ea7ffc306..f0bfcc0c40 100644 --- a/dev-docs/adunit-reference.md +++ b/dev-docs/adunit-reference.md @@ -37,6 +37,7 @@ See the table below for the list of properties on the ad unit. For example ad u | `labelAny` | Optional | Array[String] | Used for [conditional ads][conditionalAds]. Works with `sizeConfig` argument to [pbjs.setConfig][configureResponsive]. | | `labelAll` | Optional | Array[String] | Used for [conditional ads][conditionalAds]. Works with `sizeConfig` argument to [pbjs.setConfig][configureResponsive]. | | `ortb2Imp` | Optional | Object | ortb2Imp is used to signal OpenRTB Imp objects at the adUnit grain. Similar to the global ortb2 field used for [global first party data configuration](/dev-docs/publisher-api-reference/setConfig.html#setConfig-fpd), but specific to this adunit. The ortb2Imp object currently supports [first party data](#adUnit-fpd-example) including the [Prebid Ad Slot](/features/pbAdSlot.html) and the [interstitial](#adUnit-interstitial-example) signal. | +| `ttlBuffer` | Optional | Number | TTL buffer override for this adUnit. See [setConfig({ttlBuffer})](/dev-docs/publisher-api-reference/setConfig.html#setConfig-ttlBuffer) | | `renderer` | Optional | Object | Custom renderer, typically used for [outstream video](/dev-docs/show-outstream-video-ads.html) | | `video` | Optional | Object | Used to link an Ad Unit to the [Video Module][videoModule]. For allowed params see the [adUnit.video reference](#adUnit-video). | diff --git a/dev-docs/publisher-api-reference/requestBids.md b/dev-docs/publisher-api-reference/requestBids.md index 7a306ec4ad..dd1c43be91 100644 --- a/dev-docs/publisher-api-reference/requestBids.md +++ b/dev-docs/publisher-api-reference/requestBids.md @@ -24,6 +24,7 @@ Request bids. When `adUnits` or `adUnitCodes` are not specified, request bids fo | requestObj.labels | Optional | `Array of strings` | Defines [labels](#labels) that may be matched on ad unit targeting conditions. | | requestObj.auctionId | Optional | `String` | Defines an auction ID to be used rather than having the system generate one. This can be useful if there are multiple wrappers on a page and a single auction ID is desired to tie them together in analytics. | | requestObj.ortb2 | Optional | `Object` | Additional [first-party data](/features/firstPartyData.html) to use for this auction only | +| requestObj.ttlBuffer | Optional | `Number` | TTL buffer override for this auction. See [setConfig({ttlBuffer})](/dev-docs/publisher-api-reference/setConfig.html#setConfig-ttlBuffer) | diff --git a/dev-docs/publisher-api-reference/setConfig.md b/dev-docs/publisher-api-reference/setConfig.md index b2997186a4..c944468db4 100644 --- a/dev-docs/publisher-api-reference/setConfig.md +++ b/dev-docs/publisher-api-reference/setConfig.md @@ -19,6 +19,7 @@ Core config: + [Max Requests Per Origin](#setConfig-Max-Requests-Per-Origin) + [Disable Ajax Timeout](#setConfig-Disable-Ajax-Timeout) + [Set Timeout Buffer](#setConfig-timeoutBuffer) ++ [Set TTL Buffer](#setConfig-ttlBuffer) + [Turn on send all bids mode](#setConfig-Send-All-Bids) + [Configure send bids control](#setConfig-Send-Bids-Control) + [Bid cache](#setConfig-Use-Bid-Cache) @@ -132,6 +133,18 @@ Prebid core adds a timeout buffer to extend the time that bidders have to return pbjs.setConfig({ timeoutBuffer: 300 }); {% endhighlight %} +#### Set TTL Buffer + + + +When an adapter bids, it provides a TTL (time-to-live); the bid is considered expired and unusuable after that time has elapsed. Core subtracts from it a buffer of 1 second; that is, a bid with TTL of 30 seconds is considered expired after 29 seconds. You can adjust this buffer with: + +{% highlight js %} +pbjs.setConfig({ + ttlBuffer: 10 // TTL buffer in seconds +}); +{% endhighlight %} + #### Send All Bids From bcc89de3498c01e32c748c195bcefd7bf5cb720e Mon Sep 17 00:00:00 2001 From: bretg Date: Tue, 1 Nov 2022 21:49:29 -0400 Subject: [PATCH 080/280] reset digital PBS support (#4121) --- dev-docs/bidders/resetdigital.md | 13 +++++++++++-- 1 file changed, 11 insertions(+), 2 deletions(-) diff --git a/dev-docs/bidders/resetdigital.md b/dev-docs/bidders/resetdigital.md index 1b827e844a..cb44bb97b0 100644 --- a/dev-docs/bidders/resetdigital.md +++ b/dev-docs/bidders/resetdigital.md @@ -2,10 +2,19 @@ layout: bidder title: ResetDigital description: Reset Digital Bidder Module -hide: true pbjs: true +pbs: true biddercode: resetdigital -gdpr_supported: true +gdpr_supported: false +usp_supported: false +coppa_supported: false +schain_supported: true +floors_supported: true +userIds: check with bidder +prebid_member: false +deals_supported: true +pbs_app_supported: true +multiformat_supported: will-bid-on-any media_types: banner, video --- From d0b806bf75742ff7911b47246dd65f5a21f5fdc7 Mon Sep 17 00:00:00 2001 From: bretg Date: Wed, 2 Nov 2022 12:39:19 -0400 Subject: [PATCH 081/280] PG targeting - added video size (#4122) --- prebid-server/features/pg/pbs-pg-targeting.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/prebid-server/features/pg/pbs-pg-targeting.md b/prebid-server/features/pg/pbs-pg-targeting.md index 54d39deca2..59fb8f442c 100644 --- a/prebid-server/features/pg/pbs-pg-targeting.md +++ b/prebid-server/features/pg/pbs-pg-targeting.md @@ -57,7 +57,7 @@ The full list of attributes supported by Prebid Server may differ by PG Host Com {: .table .table-bordered .table-striped } | Attribute | Description | Encoding | PBS Source | OpenRTB path | Operators | | --- | --- | --- | --- | --- | --- | -| adunit.size | Ad Sizes | [{w: 300, h: 250},...] | OpenRTB | imp[].banner.format[] | intersects | +| adunit.size | Ad Sizes | [{w: 300, h: 250},...] | OpenRTB | imp[].banner.format[] OR (imp[].video.w AND imp[].video.h) | intersects | | adunit.mediatype | Mediatype | string | OpenRTB | mediatype="banner" if imp.banner exists. mediatype="video-instream" if imp.video exists and placement is 1. mediatype="video-outstream" if imp.video exists and placement is <> 1. mediatype="native" if imp.native exists | intersects | | adunit.adslot | The ad server slot name | string | OpenRTB | imp[].ext.data.pbadslot OR imp[].ext.gpid OR imp[].tagid OR imp[].ext.data.adserver.adslot | in, matches | | site.domain | Site domain | string | OpenRTB | site.domain | in, matches | From 14b341a0b014a7f76c7baab1c4afe3e0b46ba467 Mon Sep 17 00:00:00 2001 From: bretg Date: Wed, 2 Nov 2022 14:09:22 -0400 Subject: [PATCH 082/280] PBS: added SSAI to diagram (#4119) --- .../prebid-server/pbs-basic-flow.png | Bin 42476 -> 47186 bytes .../overview/prebid-server-overview.md | 14 ++++++++++---- 2 files changed, 10 insertions(+), 4 deletions(-) diff --git a/assets/images/flowcharts/prebid-server/pbs-basic-flow.png b/assets/images/flowcharts/prebid-server/pbs-basic-flow.png index 0d5c5b09de4559bde37b8924b286fad241794416..e28797a78d9f47f4c1af473fea468de5301e6783 100644 GIT binary patch literal 47186 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 literal 42476 zcmcG#dpwixA3uK2nNm4N2NGgAY=%)e&3T5I&8dj7&2h$@<~Su4qC}2iDXpag<9ZvE;xI5}=B(_~I6z7!Jm&xHEgFmM8O2VcKHYGfEaKox-k|F@$?l0v{w@HY7FFxsizWf#4pj^$|#IgaLS4-QE`OfKk=80Ix#=gGu0r4aqM!jQ5B|Ktxz5 zc*ojMPaCGK2iHSt!*%t+FI;@dz7c`{nubRcDbknnn;vYGr>kSME#1&n>mY^{Z63)m zB>bi$niN3~45R)Y21jTcXoFAk9*$(tNWbq=!onya;G(*!2rH1Ke|QHD3H-w?3w<1l zu7?P-^wqNWkMkrsMn*AyPeSztcl(R$Sdd{_@ZXalUE_%Ukzoc_SeUOZoo?Y4N7S{` zCk11Px}kUil4xk;96~g=3Xi3tL#%vJWHJLsj1G%5x3IH=1$g><*dapbaYlN+aUKj9 zEXdxLN4IN)ML5A97 z*4hJ21V^DF(H;bU`w*i5TR%4f#g2iaIN68UV{!I23>ybm8($Yfgnfi1I?yEy8{}p| zFmiTA*oMXUT7`oTdw|kl?MMg@2{JN|(6`ZZq0+$}#G&2&BOOVx9x*lykP+5sv_6Vz z5NmH2?G*0mtVgqRVHmlEGi>cqmNww`s5l1l*F2yYpe&6Lwn!r*D%KD@e``G?$(D>T zBt=EII#S^tx=1uu&n7S!rAyb1MjC?Bg3`rW;IU+KFpi9%GW^YBasE-B)NoQPg-#

~Nhlh_%Eb}Kh>Z<~Mf=AD+1U}TLY-^^Nfdu8L!uppVrb_Z z03(qR{#GPs5`jd;pn@!57KkV$!v%>BHg`ti9Gv_u0%GV?C-XoXw1qj0gfohBpapwS z>EsYX49zGG?dIU%NM-Wg!HbI_fJxd}b2yJOa3=E7VMufYd44hy%I*vp! zBnJDFun|aD2o`V46K!7@+0E0A7~l)T1X*J}qOE*`om~U{9h_`EF}hJSw40wR%+oe9 z#LwCV8Rbc|_6+p30w1#vL&tc);IVLXJjfU8U@QfEr%<9piGc=$FvoDLxj8m0&X+{M zSUG{;1O|e(z&gYoM+o(%dO7VWED$;4PyVjIDcYq>V#> zeE`}v)-cc$VMk)vI%4ettq@T#gdN2h9g71^j-Hc|Il{``$x>g>T90mS=m0*9i6YW* z?hb}=&O~QtBbcjxtPR}X-v}FQL~|oVVC~%k==S!J47~`?XiJ1!tW7XI(1VOcJGvP} z>cXSK-8@|Msa78Du@06|HX%+lr|4iBI4jzm_wERb2%;OH^)a-_a9Fqng62etarLBI z`-M`Rtzp4#7Fb=25ELfPMo-Vd#wpa<-PXZ5)Xfs>MnfB7!*JH&FbWDoA-Y)7D0B>+ z;ub*(3kk9&I=Ip!F?dH@l!FD%(M~tQ(!tULPoxJ?8KfYGkkC+jq!S8?iPWDNK!k)b)220GXdpk82}E`jfe`z+ry%*l`-TT#=!UvR2Ic_>b1KZwHqwDe zCmHy9xa<293|)N#T=34iG(RHV7wrm~4^)^rEe?mpMHqT`@-$d4+%nLOY~de^4>mM% z!I;x@!9}S-p(u|qUw0#4Mo74modep!KQzM0$=Z_|1MWJE5*py|kF}2oCkG&%jjTMt zX~35*+0WP4DH?7N?m&V^`=RxbesIqajFr2gox6pfB?=X6<;ieziHUT?;=<_xh%gKi z8y%=0Y!w`VCVRkQ!(kED){&N;cK8TXINjcj(Ts?gis93pH6b7Py$`44kX{46-6R>j#87qJvz*U4ue{bv;lNx(D17W{B~}+9CpCoq`c=NDH1$+6P8Q zIivg|3~8_se-9T2N|3duJI>95W=OVo;PK1A%^Dm=52u7!na2j%>N-SQ!Q&`l&Y@x8 zZ5xI&PA>rCN!24exp)ToAp>1PqTv`1q6esF*4P-`2!|L~Seyek(8C7hOY|qv44g1d zzTrmZq2>OBX^cOb<=bg`vTXqjclQwgg86 z9gD+}33jnYj_!f}NDm^Mqz}WvVu7Q?-pSTFC;*O% zCXvZBM@uX%JSfHi?&%&zz*`1{lSsH&bDmKpMS6lCD0`y2zj=&PoIx};)*kBwqZn8^ z`q`0@m{@QOjvRqC47G}81UvZJ5{LwnlfQw1AKKLc33qToxVh>Y1Ub8fknQy8a3?ZP z7lT}bgV1q^I9D4GmRJYJ(UBp z>N`Yugy^}4;n3z-iXR%|>Y-0@FmiRmAyHI!I4IXBdpyFJkmAT zi9|*t0?0HM&o~1k3<())U}ZzMq*JlfV2nS?-4+E4wPzrsks*c{J!E(wf*c(OQi8DZ zkEZw<1VzRLN1_7!eX-~;xA16P7ds;x3rD?Za72)&xdCW+QFh=p9v#4w^%w^p6hrWE z#XlJC7oY?G{{xc|R=RGnw*f#2u(LGB$9jJ`D;$d_e1H5-ROK7AT>6yqCQYV5lvnei zP&clayW4eV%dXl9sNM5!nfQvagW+CLGI*GemwB`Hai)lbfMwCQEHkCK0Eizh8hPv{67=iSNH& zn|4A(37JFR3jTK*TlTjN|1c_4sH7%L&U+Er>s`q@OiA<}9%Z@}HNmh%I|7lcVP4oE^YY=MG>{ zn6{fa5Bw1GQD=ISk6r;X^@b<+0vV72ck|S7N1z+XgzY@A_2UI#53tm~Rk2=^^KWLV z6fjev_qp9?cZ;M-a)bbNRYl;l@Q@(TQ&5p8&W!@7{3kd1>|;(t2E=`YnL8mR0o3J> zJ3IMWbn9i3M22(#zWUW}0d9a)XN2+kp;+J|U$4UbGfk%<2|_-bfhG;#U`WX)u^NTc zzsGuB9z5wHt%l0rP1ifHv(KdLwSXr@KijV`Gc`R>QK^i|^ass1oU@CacezfJ)4K}+ zG=_C9b5>J!-A?FOf8~HA4+69nhcjn4cD&~6U9fSL1!RhGWDOr?`&`L02&gn0oD;487du!R)<;D$dDJ*S&xeTin@$!anYtI{?imE8F&`Kdu!wP)WA~HI!htD*{k(H0-0SykQFRZ#7M&tt9;&@ev@LAI_ zT{v^-IJ_Y0@b=A|pYQNJ&KHoj(1tXL@lz#UgXZ z_XHE0I?3g=q_WP@VmEj9059gavWi0bUm^Id$ClRIO`MXFt=rF2>S`?WMUNagvL^ZV z()WMK<8MQ=S7hmS^kjeM=v-r0dD6CTM%iwkRVpzhtMUfaezB%^$>Gk<5=R{WP1-NJ zjY|iPKzl~#hQ+_U+rlplI~_@EZJ2d|O%3yj5xkw9os)=h1f7425AWJX5h6w??Hp~} zW>}6CTFA%t9d*?L-O0a=PwZLdBx-)O%|)4LK!43A-SJ_5Z^4G4m&dl(R7*-&v{yjQy@;Zs@UhKz>`vgBemg_a(MuxUbFOJH|$P8bYSk({vw^^02739kj z?T!*1Fewl#uaMtaks!$lICkmkf9(U*CO=f(XBD}p_bJKOTvMG;B-8!1>i@N7v=q&o zT~pL=Oy1H@e?NQa?d}r{J9db>xBia*8YilJ-H9D>JJQTCe<3_(e}GzXuN>E8XQ^hMYyNR!(YKpY>kl3{kh$GB z&K=jRb)x@A{tN+o^gp6CW~&52b+2cSJjNtzds0R7US?G1QYzIj1w)rw@Qi>={QTsb ze8o9Tx38lGVdX#1ffvj*)cjZJ%q`cnlARk5NOIUTE04my)ymmtuS$&Q=MwbhIWgm} zp6+q!w&?qb3tQ78{v$>yuXcjE`>@E4U2;Is@6NmVo`cz=rSTn4lMZw(JZD+JgI=j; zS-tsjpj!D~POb;^=L6RtNJ4kH?bv8W_4eK#L8qVn@Z#OLyW2tg|4PM+5~ebq8VlildFcP;%hXnJ9S~$aC7i?>*|~-O_3dUwpu4^GUJ$&0 zOAKWA7$@{ES8eHhE2+?n_QIbc0~L{34?Nak4JRn;e_66`d^I3THSwYZcgt}6No+I3 zDLegN77Fjk6M1noN=DEb)S>H{oG2jV#LNy+LTWkQ;qT5ZmE!my5}bvWu@H;YAcLLw zb<(VKvX%v_+k*%UNY|Q&0qx-S4jEai<6p8_iHMaE@*2 z_>Ik;_W3qfbFkYQUM(*#x3sl=lv^#+1QyS?tvhvS?$g17k~4=szCQUMq2UurJ%;TT z461u`kn{xQGkxY5%Z{yVO<-Ze+s?n6?$m)ob(3^mjhNhUAT|rV|3@oJV;6qsx2c9A zGYz2ZvJLzGe|$=+D)zoS=eAj%=N=0g*)j(i5PEr@OtI4_)jN&D`>*wXmDBR-c9Mpa zuARoJrq_M{2f!Z{QEw}=@TmxLMahU?<=!0I2oaGp$-`P%xJ60Xf%e+Af874hac|{0 za*+^xJDPp&fnYgRK$%pl@$0;HrGps8`FwZwAAR}_I0udupTSyXLetVEIh)JJPNi-- ziB%Q2vFD$)DWIJw8Q$VCA<1bmY<9Ir$!tLy5AOr@a4xg^@IO;If(Fy@gUFtfSSvtd z1S-iX=o&LW$_p8Usz&}WQ%OQ#VIAS;;AX>ew}C`xXxw@c{;BUZOB&$SRtr;QR*m=t zg_=T8g~;VWj(^C>F$c+8KR&#I|EpO~EWqR3Xl%UukMY;u!Lt}BaG!rHM)W=q@XS7c zdE<{T4@vS#LXn!O|6fy_+|2sAd_dPLf5Tx@*Gccd^^O#F$ibbWd6Tx?fE;41a8BuAoh&uULS=}TXu-WrL+(=C030*yXX%*O7Y)B!?1JU@;dVxteQ}LReT)_ zZ(#shl)m-&_CK;^rYmBoj6bII-Ni5-vYGI8Wvz_l@1LMB{b?=frv~7-t=II&otstF zw3Tg4r$m!?l-Vqu{!x2-duKd8S8kHdNd{6PWjF~yT=Kx$78GiDYQF39pP*PtnXhgg z!Lo7B$plt#&(&KdWjbNy?Q+t)anfVyx9dt%TWjr4FYuqnURc|$1pMZZw~`Wz<0F%| z^})Jp^>AU)Jj$6Dbg5HV2Gve~$1mHL5(y&s94uq4u}PjQWpQ*v^NmiEiTPU}(zZ~! z^iJa^j33*$r%TIdK~7jyUjM|!u7Au8C=jY3G!8rR62R>J{<#89>DYR$Q|9cRs0W~h zXkjb>u(xwkj+3HjHZFcmFYb@2J&7eOYzSy8yO?xzRcPqBsFYf{Q<+I=k^7Lpnq$ea zdxwPu zkNfsHg@+=j{Zsi0yER$p6HzbJ{|J0Jj!&AiudFkFFU>5hw=iPg*2VCT7kviW9t+kn ztgNgsvzgjnw_kO(v@~c8++f{XTu!*C8@fm5ef!u8lQU|EN`29b4?IlgZaA$aC1V2L zg6CCMq#yjcvO%~)=!+6el*`EFTr5lKcR2;Mt_1N6`ROZvVDt?H6KeQNA&F7{q%b<9 z%CYlv%L!q6RR@I=J1S1&aR~^igX z4f6n0d&#T=+y3!XYXa-7TAw~G^!cGgPTrVTZ&-c(`g6l?r%s=q<0o+v-^d!ypMMp@ zacU|!BA9W89#kePE2|4Xl)hJlw(?GEpUZI8`(9nK(!#g{9%~`Kg)P=9_~YlV-1{S* z+#P%?M8`}#%JMchxDs2T&3 zPp_PM|M+oS?t>JhXyxO0WsprtF*fJ=GvV~IiXs~wk3n34Ia znADfUxtyM!{`d}YULVA7DgKh6Nk4t>`#&J7SVYB&4LyB{mP34b*N>_u%OX;8I0dIB z%q3=^pka4&bDjI`Ol^1biOO;OvW@HP0|PY>-`}5MtUP`=F7{a#!Jp^P^q)|C z)4I|Vi&>rt{&Dd<6xYDn#Wx6Ag|8#GgIs^xkw9xDU)1n9*9%Me!zJE&sT})!?fJ|2OAlJ``Fm=EKfKWEA93s2i-PF2RW-&hmKp@V z)*RG04@TN2O+ceQcH?!?rQgpV6;-ihSAF}uePnabtJS0?-Ji`?*o_%xXpnmsKGg(1 z|6}|&VU%{Dnneg8@yyK3%bhfvAW%Pu=Q{ov!^b87W`(_E8)xaeJYn~TXf=f(*Y&lS`qHyxpa%Lq0LHq$OS5I64lK8Lptlm{%ZUB-X z*LPYbp8&QBm0v$pow{Q3TEidGB6MAXTN9vg3Itd7QM{wznt-dUxN}s06CAV2ke~Zx zM;hwV?akbk%A3!GX<+gZ^{SDNs}4l%F2FTR`>A#ba|M8PnD-eC+x{NFzsUlb41w6Q z_wX02D~B@A0G0ec0_92v6>jWk!uHx1D{>(Qok@4RPoiyJ@jAa z`rr0pMZ_J|Ey~S?JlrDg17j8e4WwxXfP^f`o9za6LOvBpTy6%a>yKfNtlZOL9&JA+ zS7HAp_*~!OS%AaeOI?W3V>;}(?)>cxf5W4#Tb{%OpO00=pUS}*^C-Ta4+1jp(xBhr zgwnErChK-fuB!Eg%_ri(AQ93~H*m((x>}u}#drQQ9vDz=(Mp!S-g+-=y^jR57AO^> z2{2PCH#b6lrEJ~3`DtE)&ed;#^}^hRQURI~GYwdxI%SkfuFbxcdNk^0(t} z)_#!5fd3iO-5P?O7S2U{73P`JaH1uP`07&4^cA`jhUlB;!k3zfipsoo_PVleGN0M; zE&M~mKp{{nIHO2^=6f8?exQsK9u5S>2r~}>tlRf9 z9cQ=Z5@M6a%PO&Jd!H>nlWdWmcwMM*`2=omtL%~VH=;jrqNhiJ17W4C8csLjw9Cx9 z{SRhyu}5~EpZ+DC@}P858aRYs(wXu}f^Ex=Map#UnN4_^39$AEgY^Qn5hL}i)leYh zs08OO?A=_*YX&gRUv63bO;5@ToBKdirZZq|!;l8BDCpyND6n9KOn6^{_dC7L_;;-ss6E!893ONP55kkH?zQl-)Un#R+2+Y{np4+ zRzuJl46k>q{hd)exsQ(prfRbaXon6V_9|&KhXePJ^>3UHRq1ZvUVsF?ytVCG%`{^q z{i#NkZuecwf=e$n@a+IhQkH{#+)tpL(osF(M@G-*!#M477cDgA>>K ze!KK9yPk6gDxXM?v9woCd|G)3sWRAUFG||YLaS4wKs%$vx5Bfxy1((@F($7lv+w$` zqC=qh{eOA~(5xYU<&ysYH)~+r4T20AV}$Xq6kjyxP5R88L;vj4EC0r(+b1YpwK8#_wR@()1)tC5&pkOD~g7A9)$MiDS5 z@cdge6=*^u`Tv$-;SN=wf3LnZ{u}nW&A-P zVEvE?5YI34%)||dg`2S(CQqVBdAETx#dD1fCD`zLnF&#Rv<<*Q#RqM0M=@89TJQYj z50&`fAlsW$9X8%7FjHrJSXL>uKld4?>>s-B(}F2ls`)bl@B;P)ipdNI-IO0YH;@Tj ze>@Nu0|l%T)p40|g4E?LAtq0LsKYaJ!`GE{$1oy)>b_wJbAw0DGxqTZ_-o*428J&!5r)xjLGa_`7vVS4Ish& zI2K+rug47LBR6qZzc3IAu7y}*p&?mdwJ}7LpkymH=)S*&BXNi4dDJ)yzY&ooST@Pg z#=pHCb?4FaVpCFIH*%~6L(fr_9{2QnQ^s-&uL#<=0Z31-L`;FNsLakl z3SaEgOkC~dPYG^SCG!VXLGUw+z_0rw`zIs$>|~$_UH!c=pWOWwpT2dSQg5bHcKqxx zpIKQun~|PgVCSG3CBiHJ(S)kzGH-chm(kzVb0a_n25I_J0h zMjvS=*B5E@Uzu|aIXd==F?IZ_t4W(;ry2Zv^JEeR>MLV1ceXJ0P!v=Ws`kL=QRY`e zbu+fQ3+CDV*$%-Oapu$r^zDStYr> z>up-J!bHd(Tpr1AnwhS48frC9ep2R0%t~28-`{_2s8+5l@z(Y0G_wS)u`vOuV^-{j zw^K)$A&jlMh*2*ACaPI0YM({(B*Rr;BFe>QgLv=Po{iiEW{cz--%kOqf)Y@w!vLxD zW6e2|thSh<)PB4ge)Yt|Z{x}QGi94Re)PWHMqY{GA7W_9Eb=fqMN3cekDebZ1ou3? zB<0w<^l2`v+q5MuG)Ykw!~KMO^6_pGKP@_J>Q(x+s)O}H$b&Imm0?XkZkzvSm$4n` z^793*B{78A1Ja#p@P`Mp3Wu{%&6)9;b(VkbU%n_+HrsN)zn~s=JbSZYr z%{_#&gewrq6T9_0Bdc|&s-Oz*Mm6ufSXV%Kov z*jV)hfprzSe{iS&gAmP-_(n-vOIywP%XVyBvba9~pTmXWw02#2v=gs$B1yoboAdr; z<-P}!w^#2)$VcaYc}zH5cv9=TGAq5buoMJ$$9Sy?n+cWj4&tl1l=aD31p%MaGoODA z`4}d1^PzohPtng*&I9(;bl$3}7=ocYW>25HtI~-P@_w;xbY{Nc_o=)QJzs@wFPz_I zQutkV{ME3&IjilARx!=B)5MUoE<4-uAeg5|yp#eJTLR4b304Hj(`wC!kQwb-*Y3(` zpV8fB#$p(w*rN<>_`7{b`SEzF#E8e!uO53m@_&x%3IaQy4RG3$=N`~XYd>9h|EKC3 zXr@Fu0+k5f$wCW|=6CP~f}x>|C;O_9&s#_fB5iek4TysjC_H>4>B!!k@NVy<7)OFuZPg+scSn#NFOvyRd@lxl7F1nR~Zl+BM5D zjxK!%`Zi9tYzg+B=bD(lm^R}HgROMRRj)fE-xKcLwVWS~GzGIZO>DOMmjo4jUKN;0 z9_ztRW|(<`Cvrp%`Xl+(WThrN=h0;30AI@kOvzo!31=ni^wx-YQdUVwa51?BzO9!%+?)8=CMZGNA zrep0t(iK?QFk5tZJJ4So@kHy0*0WpA(%1Ax=~;c;G6-#72|psr)xd3ny2s>uwFc|% z!2Vwqa!C|dlJm0DNN2~IQQy;D(+<{X(eC}%jI-;#Kj!V7QkV0J7T3Q0We->etlqA0 zL?kx%*O@ryx)vRD&WhDO-Xj1z^bk`Z4IO;2yrvEH2ERt!_22@PyrS@LBZc+4tSTGNLjSR+-*{-bqWB7~3-_ zm)+ILxw>LI)~$@nKHT-}v%-<|=GOJC_V@bKHj2z?-#JBolt~}jx4ZbVD!!*MKQI1U zeO9F^80@=(Z82xNPH*AE)i14aL3+^otT+f$QO>({FXr_A!KAaq(R{3GjQp!RBIo%* zEH(q(Z>O=@WBKVS=TW9*_{vt*7D=de*k%dh`)H%V`?3XkAEaH%$BQJO=oea$x3lup z_Ps_RzG}=KEsy=VMduUQSIE@51oUW^?MmlAY>vHz)EOhccaqA54z3vN^0~X3l^;20 zveEjoI{r(sax=${%zi!D zyS0oZRz(uctM$r$mnb}Ror!R9O|-s7)k{u>@JY>hmN=-kMBZixAx^y}-G)Y4f zpN?gGjmf*C)*Six**K{rXCGKJ=xU6Q(W4IZdR1f+^}xg`=(P|tAG1w8og9RoKN%oO zTiJ7pR6sZ#pPK&l(dQRU&obksH(4jC+r|i~T<}@AV^`U`k4)|It2xR&FP(`Ae=}HE z8R;C*an+1nFr3}A+z@qg^j5=_lM-QM5&!7MCdg8DA@=Z7M8S`<$2FFWI}<&WWzp|8vTrYb5Qo0`(azt8yVqmJ@ucnleSg8 zy(zQ5{%7?y579iY)WVCd`+tO-ALCRm9e%|)x-~-NSC_-&me{lb!pF=wn3NiZd)@cp z%*ym*{XMyySI4i|81Hv7=E+ot1q9X~C(rEJ?H*`-_Kbl4=NlZjv&E3{j?7h<@}px? zJMozZW+lDVj{3Z3s7`$F5|eTHpxfH^Xrmx`#N@RfN{os)@9zA(Rj$$~S)<&fY1Gvu zX@TugINI=-zd>o}y)b0;;i~?T^gdBVjUL11<25bt*{uW>dLEWBo-N{FEr825b7uv0 z34}Ua^1PWKu8t4guh+MWu&QsmalX(??{>@>bG%!(n(ih_e)b{lPz_ik%($M~YMpa6 zDE-Z9>3NJpnaMV=7IRghWZPj4ZSBW_7tfOIy4(AIP=pCj-hkn7M#1qN8<0EqO5gZ; zWR%rk7~`4e6uR9#f4(X+e&CGU)tORts@wS`SYc{j;Pq8H=EUGDO#Hna2P%B;ZAA7M z7WaJQ0qRX#Qfxti`}FkD#xq#K1+pk%xs$l1E5#|ww344gArVKXB%dvrqeyZ+<7~thz|CZR!sXVU@?%@@Rw#06D z8cJa|3||XByvO}c`0l!Zwu8C5xB5o$O8U5q3OWxEn=>ei>(bTJ7F+6kUT(~Jw(*>b}wo5_@RRT?lrbK<-m5s z&bBrSs`k&9Z&Xc9%T5ogESshr{nlta`>F(-Nx#RT;&;J;%><)Qw7$DWiGdd?FGy#< z*ol1NDKNXjlCdviq1lr4uZ1CoLT39BfdV=$UJ}oZrL6r6^T*Vv`0-y^^L^Gz{;3=< z1J8QDtBNuC&FhjM=e)|oj%|m=G!Zq7_lOeEI%OAyby(r|CO*7>Pyq)_E5VicAaA^|1y`mxdP-Glur;*dh zSGNeZ;neLU95w(W=stm(9CGZgH+x4eG%fP?LdthA-#lxJ(SdN=5+)@%ZtZujc0?rw zjhpjwd;>O0C0MJt<6-Q$=yq4Rm42(5oM;uiD6^zj8?0LmUl~*e!EJg8p-Nv4;=U2= zNBtBkV|}XNLR$XJ*B66kECmQN#@Rz|+LeC>&Wwj7YyhKw3t%RTZ?Mw1BV@t^s4w1@ z;FHuj;YtNyfLS7-SUCB0J9N;_s_>)W!^6NTck*eqBfj%jWq6B7stgAvx1#M?EtJvb z^(8ow+_Spy)?&CZBQYwi^=iK52P$k3e$qWBSZ_J z2{WH|C_7K^v}Z_@XU*!YPABp|Z@y=6rTK?e@*WG46i%P61Xdab#p=Nli_sn3+%va; zs{r>(Y_y2Xg@8i&<8iM-PAcoQWtxDgh+u$uiv6U0&a-N;UHUQt0*kBL%-u~Exctgv zYmgU@^(DJDIkHO>&6l?COQ^mECeiZ`>J$GYqUa@H9@gX0iT2E-p2Gd#zifh*KKWo^ zOkFI7lmpy5K$5|hjnYsmV)b$69+~2IZu-OHalnAAEto*%u5_Hk{-WdLX1+^Gc$rf( z+~#}fSk)1Ir#5e};&AJW20RdKhiJPg2-Lq3U)Lq$axsjL=6VZ(AFf~3N4Qkc*C`$0 z7%5c>0w*Iw@VAW z=p)U<0ohq$=0iw`mK=*%XF~pdM~s^dcnds#D$Q|fr#ml`$);*mOAqdjrh7ns@(LQU z*6E26Z3m43B%gbr+NICyn1`Nxk^ysR?;!J_w45~KlR5aM_$=4?(d+IHN1AWBBsz*l)Hz4Y#YvB{7 zkfCWn8{ldtV^H_;qpt7k?p=29C7!K!C_MKJj&45a^1)p_48!W^^n|#d6Cn`2`Q~|* zs?B^L(VIKW8`V+&Lpyo^4Zpxx2R!R(1Cuy=2_C+Q>D@ty9Ktb6>pr{KDVSbgkQN!wt1{LGb6z7&6`!SjL?Qby2+udf#{I4&a1#Z=fh+seFj>=bUk+{7IPVlS!HfA}JbpokI_ z?n-Oyu@WVuYnP;H{mK|_Dl+T2>P1g9IXEb9+$pRxwf3peZYa4dsbl#uzch5W-&t70Ys}6+=0DY}K_qX> z&=~QZK-HlfoC*-J>IKV?)p_7A_8}BlIy}~dsfH$-n4@G&!)k}tgBAgCpqul%ZkHpH znt@dfbeD*lNI~GQW?^UVZm2jt{PXw%-6U)jK@Gch?pDA46l;VPK7kZ%PCwdoD>--U z)DdXa)J zDs|Ky=Q9%DGSbF#{Wdgn2$z>EoY=_)(mVR6p>b+w>Uv{tPBJbjdS88d^O5WOGp6W) z-DI(kk#f+Evgu>#@uKd@b{_{NDrZ`RPN+9Dk0R>?+~_~`681vg8T&=Ve?7qd9V%<4 zU?n*CV$9I8PSd-xgS-|T>W0_1uG8kXE_(;Q+;+cc!-;4JmyW-?`K9Egi_hlpTUsHu zJz$^v_F+@#lq$Dr$acK!{*;x}N{f&&Y~KH!_s_%3pO$qIGxtwmE7X3nX_RHZCyrI# zjU8J{e%gbb)1AF{=L%wNeg%fOET;B?!-E_0Rw`=i~Y1H=&BJIfVGd!!y2{i?4Xx*wcSA^!Q_kg3Yhqk|vA9-S2)z ze(AlxZ?83j^C~<3@$mfM`>9jGk-vZw#*D(wnXv{75rFahose}yI}sYqYa`9YdF^Oa z-uK|CZh5fn$+PeN^7Ie!necc;o#|%ZD@F3Uc|oLEohIM07kQ7buW=(3R~Iv%8t1<$ zAb{q{Qb|=Lwe2hAEt2Grw&-Z}z0eD&%1G>?_NQOD-P@yGb$=3Um_r;0rPgXN2@-W+ z|J$Zqjw=Zjo#NE@b~s6KYRlfci~Lgx7k+2z?+ZMz zW=B?ETf3I|t1LMSfPqJ&G!-m^r~8u9J~gfM;Fh+3gJ2vFSGE^z*3HYyleY+-O7dTv zlHBQ88#JsCTyDCwCcl{3KCzr~$L4Am=={&`PN7Lak+j*F=6h3^;-ufnJ+|fnYV3-i z;^9Lv7 z+E1x)*z5IWqPIV&t;{c=dnSp;5OE$u#BS&w{#qG5x4fV`_NcI`pB>J>6ACt9iPvAf z^zmc=y|s-yo4?<#-O_$Q2!bA_YqXV#Z+hDerg6L` zSY2O0M8;VPoe_Vkvvg6hp_srSwCQ%(ZF_OEdQkB+clz>ch0)8=lONuWJQnZTc%ox6 zF&j9d#%AP0eo721xp-BG%Cmy8RigJ!%(Weaw){0};vC&N z?G$k>^uCxH2*r$C%=gvbl>>_rFXf}^HPhNZK9`3Ur&zxzsav%|*+qTe;T*8BBqkH= zQHBKkHh32I~zhmqAB1`#yQLL_qxPmh+V`Djnkg>Ha zC~e2}buA6?7;5J(OEEBKKA{D^1si|a>hL?pD@MX^9{{5~UO-!?Rm7E4|4~#XoKzRk ztf1+AZ~FVOhNExR3O2Ay^NydrgNFIN?p*12In&h8H5F!tBJIS)=&AlL?+HuV#BUI3VW|EwQgz*Lla@@al*f~Iqo>Wvz{I(+I6jfSk68`s?5ylB2xos;pwh}Vvd zs|dO+MlfOCedT`c<~EY&y6z!~>4n4Z7Oh=f)r#s34YdyP{g|wJNor2-R`2uTTUwLL ze!6$j;o=HCc!gKV1I>Zggzsno&YTS`x>mQ^x1ALGHJKn=lz*Cyj-uB*1bb3zlzC;-fJENMB|FK84ta1pILe-=TB68f6&ZJYe^_*9*&PC<4vx|q6gzi6KER zpLo9y(64X_TzTk{UR9F{+i=X5OL@Rt?K1+{Ufu(3E<1ih;13&Ez=Ydg!RP zrgx)MbK6gmAQadunm%$CjrS5IoU`3^uk54*^ds@zmq#1bTDQxe1y9Qvb(wuz8SL(j zbV6K&6hwdPvhnLEF`AOkv)DQI>XKB_>a0!OAU`+q=xyg43t%nCN(pa#N8jv95aG}< zr?a;t-o#9be}A@nUOBNgqW`t^8w-viHnD4ZuX97dn|qzAcu9`!yGxd@!H({nXyVFv ze{Jwp@JB~`D@K=xjJli#iv@lxj*XU-^`<;}Ufh9g1{^?H*IPt3w`uKnEPz20zsDk3 zy^oGdb=6-x)iQwuj@|+-M-up3NEm83kL_}P?%1~&%ZfdPpSv!7u+P5O-j^A*-#&9h z<=4WO|Ff{zF8tktt<}_$^wH>g_;|06{E9cL;tqB&N_!KX2|+PjN7vxh;(1F>9#l>S7?5DZfv04 z{l+bfY}JRnxKsDi2F82Fu6xS3mfeV4xpyU55-LhKKTS}cuwzTw?X6BcBE>O)ANaE6 zYt1{fw%`Wj$0@Hp<#GC8q?6@x;GI4D!-LV0qq`u6*|_;{FP-9{xaO8uU@A+quxLGZ zEj$X@q;Y&paVkfWb^X~a`jM1CJItreWoX>$q zKSAHZc>HvHhfFFO45fx9!4^y)BI3@_f+_WQaN&S&Z~xv-j4`V!sZQ6y(oYhqlpTYG zzdY#UD=DT{D5AMHI#1!!i$-^yGx-j78s{o1Z;o}%M%=DTZ4G?zG}u%om7}}|jG;fq z?_||TRNg5jE;MxjP?NsNj@kYBvolA-rxJ^ne~5Dy&OZl_oDKsKd3YFTJ#Yk9uj~1oRbO_y<8p- zA~-KEUMBkp2%}Q5vxf%PWtpl6oQOR&z4u+!MxF|kB+2LHp34L?bYn=Z+hD_5*DU%% zza&Sc$`x#hnD76o>MOvybN6#iFs+N!^ZrHYlM1jEI9;THoS<+F1QWZ!#u}6eVa=1! zwOT%O!=<=x(rD;QuG_fLnwmX3XE#26@yy$N*9+(wub}s@6FWff}ahGV*20I(M-m`icS!m51Owqq(zk;c(Np6IE3h zy|D1>PtLqHe(6!2pdUT04M~uf%a$LUb6CvOtlnwoni|w{a);rklNKk7i{rVePJ6~w z4#ZE^Zie}AA@91c?C-JN^Xe8NrgB=x?{VgR8^y%b`gcit)tL2fqql62{{m0=xwcsT zO64*LfvpCYlT`5?2$OPQP`W3-H|b;Q8+wy&dgW!QZC}10XhjmLSm0Aj7cWgZ;k$xcPnJBY{D^#Rup&davyJ zj<$*?IWtsP*4mfR5dTZ-T~cn8PJTOu(r1d%QKYX?AV6FC905KCnGUIi|nZ zK&;{B`aVLw*y~Y4?MZ`v8j1T+RoH}W z{s!HffGNghJ9a$nq(kEufQyE*nX7DO=xS!&dH5T4Wq>S@ZhGIPM|f-=Sx_u9Rc%eU zwosDpzRvA=www?I?Matpx`j<7=k49Z0(F^jqUNui$B;#w&c)^jGkMd9Id4kcTwe)# zojYdFbay`;&ey=6UQ|>o&?;f%Z@#o=qjNr)amiN8Ryh3~^P)dn@na5eX#j+KoP01p z0K)RwUo1omVbiegIW4@X+#q?@JYH%;Xdk%~*=8%L_)P(OsbtkKJlNqT@{3Ut#X&b{ zPw=0&t%4GMZO%w7p}=o@rA`QRxI+Ejn_i97lLMNN>L{RXr}4Tv8oON$o=wYIY1$R< zB_oe+IoBi(6aZEqh-xqZvu6ZgYA%*Q8n9XL?iyyDtLyrl}Bl7_(# zF!Aftr66eI;h^e8uetSP<*yH+I_6(!XsrgausR~>6JnQRp&VEqGNKW3h~t@?MeKhC zi$!~eI23$vCYAd(GU$+!}N1L#$U~pUv7>t9L2ZUDZEawB+g!v*)Uxr z-rWwJ`=QGYD~ldNk!DFrl&mu8qK)k8nP?^|bzZ%8c}tJZ4-W~H+G~*4uCnCwY+=ZD z@Q@@^r8jiFnD7%P8cq|5&=VQA=E%}^Z12r(`u%M$>)l_pAlNA z!SxDH0>=zJZwFUfhAq9=^tEmN9Av6Wy-;3Y+w$$(QW#YHYo-;}t`C+F$mx z3Qi7~+ur09Y$FAmjfZ^wNT)CrqgaiP$l$w2_x;yBMO}nO-}2+4cJIwggY3#R(+4r! zu+4P6OYM%2Otv_KtLZ*X0y3c60T7yqetzJ`TIIN=UTHbf38uSZeX6FU%=%;C)Xiv- zp1E9}9Ezy^=2CBNY*yuPAg(e?QycsIqG;nm#X~>`nqo!I4Ph0gTEk(sj|G`V9l^b8J z{UzZH0}_tyIM?H0YMcJilN$y}JRq{@XmfMuKmBAjUTe%i_uy?nRe@Hf!Lb@bqegYY}_iicQUD{<~> z4U#{9?q-^1^A005u|Uk%ZfoU|T{$hxPKLan1vUePa3HxL__ZLCXV~aYJ9S+s1iK7Z zE5v5J*Ff1PuZGBbmK=0*xhmv7o$~J=p7x}P(*t?aw*{XyiwS|^xRChnV-D&e_VHZ>Ul`WnjJ(@g z&w$5RN^dsl)e<%rPtYDFf&lz{DuA?pX=+S5qA=X+<7HVr#T@@Q9YtLj6hU;W^ub`0 zf$m2i4^d=R8HWY}4yiCE&aMTv;im3Ty`?}@+hw;)<4uBQ$w-L2F{p2jKZ zqD$dI;aeWO-8kAHgIyw^+}IuKCivO*nvz0bHd{Fp!q2Y|OvFGS@(R{Hss2XLBsOfd z__OdQi%D`F2ni%~SRBn}xmOV_WG?Kp5>Eci7!%rQaNiOdBLPLhCsL&I#G9F7{|)m7 z*M&aq=ulE5pnEv)pLtg7D?}bRJ-&as|5YjfK>g(gBl5^fYbm1xoBjl9aR2=Yw4Lfb z&$R{B{tnIedq%5SSy>`ck@81>aVb0y9Nv>@|Ebz%)0&Lwya{QKO{Dj`=aFlevqQwD zA?`qj`78E_H`mf~K_NDN{|KWEhmv@~jt9S{`UF$`p)!uo?kvH3$=}PjT*;&?nEPJi z#t8?din-9`57jk(Y$He7@h~k14dk?lPN&tp8DM>2HQN37ghKmtMxgo9La4=H%A-3xl59BbBpMvJC$y_;`Fx=NY` zPF6K~WeTTm9(#7e<$a*?_ZtZ}#uf`+NPaI6koe}zpDN<8;=|_l-0AOY-v0ZVPER*< z-;D8|3gnyfO+;exoH-m^{|)?QL7@5L-Ik@6w)j0iEnn!n^eaiUd+g=dEgopSVU<1! zqf5l|CyA`>B73$y+?w?wv#;^vR1-O@wez5Yyd586In;Gl-jCjT6IP$LP9&Z(+_{#NL;0qSGZdzVKW^V=QSxwhB>}mSRW~Z--=itYn^ zI07_uAQ%BW9~`(DoXLIp0p^W$Tyn<%{e3-5Uwc*lVTRYgW!a>eRGodq_@tLj^l zd{f4rM$Zvxg7TrXL|hEhs&)8MkI)>lX=P)b>KbEi9vjF6dWR=)aB}{5bQkM5|GWBJOxFDw9&ZrCu^foJlQDk0)~+MfwWrll@U zAX@G_tthZ18~h!g;V^_&B1PjDE%F5Kk%=v+sc8VLsD3%j9B9&OjXwS2Dil(D;zDss zJU6hP-oC%loH*rcSePR&cE0#RVbq)T8jIWX)2bcg&tJbLxBwQw=TL0}?lL+msaklN ze94dYLQD*=iV+)Kq0Y@L)JN&yg#U(M;o%ftzFknL-ZkALgnt!%jY(KS^<{fm#y{m3 z^|524_WqX3_m<<BG!%n_# ztsM)Ixq22`IXpsIjkU51qGL|&~rDWAx7@=^1`O6=@>X+3vV@*F}N6fI4 zxn0cyL(o2xyw{O5yY-lV^qt(UK5IazWWV5k$M70OKHPUn1@t94nRcjM2%-b`sYig#NAIqNq+Ru<(WycZ!din*vsk5?-F`o3+mxHK_O1 zjTICw-?JE^?a9;@d}|+_=sq37!Xbm8aq^%<>$6~hMsvU#JWrBsn*`M}1q>T#cr**g zsmn}455a%Y-dxPx&`5uaWDwik`@uvn)9!)XZo05}nkq^O(Bt;CFX@pUJB=W4iQ<*$ zsy1?6z`EnP+v>Vm_9I-Z;QVOAeA;cK$;$&^UrSkG{B5$t;sFUp-V-nFXWdp8jBd^o z-evA&Nc*?oOoAV@o}B%T>1c0mSb~spghM$@aMr)EV1UX5OR1&iKT05W-%2VZ%NbV9 zg>TfeWMKtoMILkCS&DjGiaw(NIM3Mr_nUvh(JZf7^zUz4$em9Z`VCnFkb?`HvIs7y z^;C6xqIsHyey_)Bs*4|K!A8j{!}k^jmuX)`Mz`;^dPs!`I_(Oxh&_=&%l+TKYPYJV z?7-X5&AkBfVjiZ5ZtrKVum-$hT zJe{6z^#?NNH+Nj7-(B$EG1K$8+zSrqY@Neg8>|F{q=dN9Cx4Yl448v}K-%R|??q{} za($?>txet+X;RXh^XX8W<1AqQWe~|F7pLjU{M8@@Z72-IOWTsO2>do2OL5p%>wu z^fO{_W|y}%I~Wz5syT&SFm8^k3|O6gr6)Pq_ZD`Rd>9ptglBDQ0!F*F zXDmaS%lW)Nad_X&enRv7H)6>La-nKpSY(4X!{qiZ_5ncAYY{}1?ut<}Z6C&B6aGQR z9AWcy?e1%{_~ym@w;>7q2B8vO=QJ`^@0JumDm<58MLba)0LiQ+pVWDr8G1-I=ei!4 zTnbv>e0|orPaPT8^q0a@L%y2?6%?W-=EnZAh+lyxyZ`0z=;DNN?YLcKWbe!q?oF3E zWrgv6pOw;e^#xn-YJ#(ju*Ki!lin$c%`! zM(`YV_Dx$`Th6rD`r-6o<5j5)<%)@s;b9lPj~j6u2Yl4rn$`2+G@awlAo@sw+l|Sb z-JO3VVXnUK#{xnv91}yQRI=$c3vaJdK7CK@)lmA`Ce5F?2^ZvTdz@wpn6kmVDd}jr zoxdvA;(D0}%n|$h`{6=Qr&Y$9eSBWMjpe-?F@JW~W~?6MpL=sR*JIelU6@01x+dMUdQ!i@U|6^A}cg@RxDkhEEq1NaoOOqGuyFx=hnr`$}l~GM9d{{ z!nS~x18?3+#sU_`;uk&Qg#ZXNmg{+JE_DAl0?IIiK2mYNOoRF&Z)zj|3}9!jpHMH7 zV85TGs6x4_P_|ei8~Q&*0b$8;|E`Tl?jr3nI*xkPQn#y4^b$$&4{l*aT^hI8U=if^ zCd;oZlp!Hh5SzwV>UelW@=^A;T<+8w@@R-i%$V;2F z;ZmgqFS_yGO~`mzCed}!C;8E;q>*Z4tmM&P#lZy%iy6~*h=^kNIQ@gO$RB?FH2j&$r6mzWOm=EL^Ti6vKo{^}MuW6C2D z;-+wY!}YE%FCLyAdb3RLBBV52^X+)Vv#AqIFDm86Zlpw|ZD&EkaRP{_c(s3_>Dh(k zh)Wo|h>Q6=3Q$V6F-WrvfpfnX>rs8TwK)m5=Fmm3ramzZO4ws`9yi8LahYuL603eY zVUhzS=GBasOv}^-In%rAkf}2a{2`=Pfu^<5s6=&@`;ldKx}5C}e!Gm`HLI7bdWj)e zERIu#wFtQBK#_JnAS7u2S`+z8_GSdVz|?O>XEXB?B&pRf<_(x#t&DO2$gv(bL~>aJ z=aSMevyu9hc6G{HG=@}mx-%Ae(!4DIqCVer?vFbo<*lSW(_ZTSTj|6oWfoYF9fKNB9*w1k^fLHaxfe2!X71>=Y76>@8Cg(CU2?A#TiJ~v65-OQfvrDsz-$?AZVVM zz_?5Qg@?po709W7G*9J!JUbboef;~M(!v3{EtGw0kEMP?{v6^^VD#miC0yI9cW{f# z(6IXG1*+6^*r@Va92d@N!C5W9iL&SS;!O9yNDPd1UN|!})TxiRJW5X+yxL?X0ycj$>b`ew_A{>AJ zr}Drt=)T-1C%AkLpbCcF75T}unWL;Tz6?H}f&OTy{EMzLPC)Gwdag@pCI;gfFA~hHpo|n)pLKS3&0+%)dx=PZX~4&R+*oinz+H^Vp&Bke~HSr z<2%BM*gtj0?tq3F%O%eJWD`ovpsGsMvV+Z~`ZSkO+f@QGZ5}61zu^daS83Y2|BXVU zK{o@qFEmhvkyPb9Ymt^j5`{|dDV-c@uqIwuV$}%WQO(K2RFAUPN6)(-^*z_IUMGOl zhP=ibIhpfe+92ByNyg>6Zzj}F(i2DySyd$QASOeOPpm2bUA|O+e}MyL_=z9&S<^w! zd4^MHr6JH*PWkD$=Z*8Gw9t@wU<;Vas#% z-Epa_v>=rLZwHF{#P%}1;Suh?G#>)`LwFuR|0TFalE}cDHQ^5=xlT8S^Q=9H9*a@F z5buQjVqBavTC@;I+Y>pk+_HrOkFY;yP|XFEklqqau1xzTEe{V+W$w}_`b*D@K|w1D zPq(mr*64L~65q@&zT_17;xxq*U(&HX!|`5VX;JW-M^j?)Jy2LO(2{VSMX}`k{{b&j z@ko(@?SQxzcOVerj)H2?>2U$t7qv7`ibX!J$V8ur%!gunetvA`y3@2qpePg9ThQ#Y zjk?9HR8SHt`{yFk@fXZnfyk%GaHSDacfmWX^9OzOLYLE(5l?ks95A9rBks|{fX*{4 zP{Byq5xHh8bkG1b0!h^>K-Oc%2x0wnEF=7QXU1^X7;|3iu3G<4X*%oaRo$!o-qh$I zhq*_lxNy;uCRSL8zE^6d3cK~u-}T1|0xaP_*M81T>b(6{AUTydy^?UG@i5v6#QoC~ zX8_ta)bZjn#j?VB*#rb&y(e#ch$Wa}m;1a6|IzK=VL{!2y?NeQ@?N<`MaR$W@lnzi zOA4;E8XS;K1rpc3ai^kJ3QWSIRd?v5d%6!8ww_VfU)iy&I zMY=VJ*o}V|HJv0<>uIeXCSamaK$Z>jKIgF0XqeIA?cZ( z%(CZ;kTvNOC`V9*JF1z1uQteQSxF$X#7>$C=hESitmphcnpxwa;MOd+#P!iaKiPHj zOiN0phi|9+=N@fK%)bMD3+1*-k_&%+z7pC~2m{kK79|5Vw1q?u8_)qLGt4X1$9DK{ z=dJH5%#DGNW@c)s|AywmoBs!zyU+0M&9gfrMIC|%$u0_6%SsyT$tQ_l4#ZeW$ zSJrS8^+TLG^1V61{b@NA{sFd!a8Tw8hmHWW6O_AgbgLQaRRm2}g8r5b2Tv;6rFBjn zoM%3bBoxku?D$OF%?zc;`*y?*Bf1q??uHAGZGnlK0L0;gT7DMle&Z@YV5WeGv@pQm zN*clOld$^b%&UE-__tiUHsz%L|OwAEYi=3*8(b7S_nQN7 zHE@T@=IC{!w&7rC`K1@U0V@}T_xS3HY0B}?tr@*zYGODN)*$>~IN)S+!XNMz8Fwi) z6c5s&b0QeMnF^Gk5nN%?^77ihG=Ivdu3Y~I1$Z2FdmxaoJ>#WnaqV0Wgo*sxxWg~d zwpli4{*x?`v<<&4Ck{Vnsv}u(0^06o=1qs0cgOZf1xo7@bX>?(!PSGgYCrvbc3LjK_m@#eFrNN-yL_< zhQIZ&F4{A>4SlnB3RY zN-xlep5EuO)}1JHll=2~BmouulK%e`l9Dy?(|`V=>eCB=7mV7Ab^guVqklGyP=ES= zUnB*V9jFDR&Amyhl7-T5M6w4fJ!NhOX0jigcV;6Nz6HN(3&2GfHA~nuUpX)7*a$sY z2q16yGoJlXA{2B@eRq9&(tHyEV*NQ+hR2Md)1buop`urmXQAXn0A%6kP~Nv3yg1s# zq^plnH&VfDQ}wsc`y6~aBzHVXyqlXH)IckTF@mSJz&5r^h5{?3PpB&o;!J!KsD^tS z_RKS`#xL9j91mz3A6LHy?W5P!KIzujMCjQzQc@ebvM79HB(yoJUrDmE8-Z(O0=VMM zSaIs!#+NjAynm9DgVnwtExxy+($j5mh7DY10`d84TSy?+k4)DWf|)u1QqvEzwx{V5 zGjARV36VRk54T#^%$R+c%nW7>8=x;fKvPiX;_9?nQ0v*h{CGQOY0<`ZU2kV0f_l#NZ@uGL$Ge*1 z+bC=s4b-oHAOc&spw{rWWllY>zocjQq<5Dz<;)PD-19pklIk^kTI z&@ceJ`0An8J8yyFA84Hw1nQdfH)fgPWlvKc4=6eAb@G(ZWPP_^j? z^DB>!j(eiHhy9*S5J^C26lTfgjB4|Lk%wwr0P1;BoOl$uE3q2S1zFX*Cm-4WR=T`A z=u=>@nRrDdi3dN~p4nRr6UYJ$^g3Lo+fG1TlXmJhx8kyDv-j2RdO-=DjIizO6Gwm) zAY?M}ruTnb_lckA%jR*t4B;n3%8|cFzmA5${B0SZTy@mjl=7js=Mg4Dn~lAuGmIs9?A7c|Z!v!*zp^Ec?lJ2qbZqixG)W3)(!RRf5yI_h_tte$k0 zzn!?xX4!7e4V&hFBcBf1Tx`s_t)_k!akwi1puK=*5i(=|+lyqP7zpgre`QX?C=&O$ zirO%kO_a%ZVy>@v_l*CCbH|H{)rG*C^pE);c|494jg5`fY1<#ziL(Qd0Uio0yZzC% zhUv2DQF;0Ofx@%a{8B@1kq*EW&VKEJJAY#ID z3VGr-7Zsp0y^ul~qvx))zSq%6hZ|2?SQhjdK=*FW`h0df=xu2x&Om!Y-k&0Bj=8NhA>MZuH!*!ng za*~fw1BceCS`+BR^-L#TAG~olG5~Ui(+l(h`egTi{KMtkriSU7^1;94L%gQ9j{hbf zzCw`?lWB}69j|#w>=;T@*_3vwqq$)qe>lCq*onaU16Xzvr}MYiz8Qi>?0ruT2vDsI zhcoX9>R@Ul9b696nx`1QoqJ`h(6T;KKyQxF4sJHH$ECVkkl}jfDItpp4GSB{l*L}E z2i*_UeskGAQH}cplG+D*hid|+ftH}@`mXApfU(y4Ze(!w1?|kYQGB>GDe`ma8Vd-~ zeu8tGl>`ZJiNj6{oa-qFhsV|D`wq8MjyGM^!RNyghA^16e(mzC>1_}0~V4|D1qwIlY?SA{>J!;Pn~Hwk|PROTVj7W z&YXJqJ!|Z&{-L(*1Z`3Y_pi*aBMchxs<)=Y+M9PSZ;pF0^^xl;Q*-hpoKgfP6mKbB z+Yx05c5vM#5+o!1&P}&89U>b}7tw($r?*tN#%`H4@W!M@R&+kSLq|{E=NZKvJyJ{# zW2hV{i7C`pa&95TY9?!4bLK1DDaifg;FKA@y4iSK?@YN`P<1?+B)Yn!X+S{=BO*+> zyLLy}O4;3TP-{}?;aD}vDRgi$`r2TSBYL*Sl)NUR?L`qTGeVoRiuHYlr9ZD9QnM@4 zn+47HUOQxTXZ~@cooAw-VKDjO|qbqQPYbUj3Fm!$QPu4XaM80Ru!LZl_03&t9=OqFh3efnv4>+-tag6vV^llrzufYhV;#$KPP{1n zAUXwD(s8^#uYVu`XC}5#?S&QhB7({&r=z#%4`mQG(QNf_s=ZK5E9tZ%`3l-ISC0tPemV} zSOunsx;V)1wV1NZpX4!ckYs+AC)Vx=myi5Ko;Tw>VGn!;AY~*~h5B0CtS-no=c`dZ z_cPUsc+2%oc)pKXfaT>*pXWlVPeb)HuFv)b=$9IU4AGZQ=5Ov;{JN?bw%V$DxL!Xl z-rj-CBU}!jnccesIh?jn4jeHGB4+aD@gsfuwb};UZ z+l$?$JAM#nt(Rz+<gP(> zQ+a*`(W_BVN~|ZZdY;4^mdF+-Qu0d_v8NP;bt&68Gi%hHltJ|I>r) zT-845#|BpTI86P8@7e=?<@XDLX)%+n+1d=6Xf zO|1fP)1QWeUi@t*_O6q!JIOX*mFcZ3ql&+-Bj>x3{=^cGA0JruXGqgMvPmI&JpX!elz06b+^$M;irBB74#q`$^Q;A9t$4ef zTA4S!R3*LplrIL&5BVYEe80tJvalu{E@|tNew{g+w6j^+rw6tLhsHwZ2}{$VIi1mR z7s%JzZhx<mKwk|Z7r#i*oDH8>? zqgw^NPY#|Mylbayolpl@c=bwOI#YvfL5=jjRXxl$zW68$H2`6P?}xA3UpFc@it8<>tZPQJn)WHhuMUTNnQjv^-jVx&s@s65 zTABWBDMY8u4^<^>O$WYHd-quq`5Ng?ub6zJFm#2HW zz>>PTm)2j`@{+_osto}jcD~WNdO|@po)^G}E#+E};qcqT)V$P)>QaYU;({F&5^CQ1s>RldY7K2HeYg%Fi$A?{UhQN-vMu zPaQ=^67wjW`6kC3fISk!&+^Jite}rtcPI6H{@V-9DY3Y?4a>#`Qdrg9Y3G}FI7qN} z=$15{BfU?*F(GZ|n&^Z&bW-s!V~0+8og3!XK+HjGIA@;jb=Y!?7*nQG?F;$y$C(^t z%O?j|aEAk=Pf~H+3f+)-nHs0SMfi{Y3}nLtI@LH8 zbMzPbm(Fe^L6n<;k->wm3q9MhDjYcP-_|YRz=Rj!s#3w8J$pty?45HS-akG4#0GTu z7p7R76vJa$C-2v(R=~+2QgUske4WsvysD?V zFM+%ihkXn@xqv1ze7kY^z1~DL-dVK9+~4ol$uD}{);wEe#_*ZQMY&IWWlk-J!CCSF z-`$e(3T2-r<8E*4+^#=wwe@VJom#P|F+Dz~sJQ%&QoK#VSFZn{?IJm)*yT@V@H$w; zID_X&NlAWqJ~mV^HpR%{N{b;s3RYxDzu%22t2^KF5ny$s5|u#Qlwnts0}< zuhzRXkniVSNhOt(2@if<0Y`2n=j2ex*ujTSg z?6n)Q;xu;jW7{x($aM5XG4I6K$NntwV2T;K%*rC8(tRO*1Y<@tXhB3PIx&7>aZWcd zbzYR|>$hQajn&Tp=Ar0z?b0CtXRwwhuCC>&4RSz^`Vc|%N2qi<#r-s)`I3XnnUpe@ zS%z{bt8lOMTM%J=Mt;7 zhi}p{_M1&^7()3J3v6(QuJ*Cunc}dC+@Ib1AOsw&xtmq_F?x+@Et!sL%ulKj3ts0? z`gzZ|0kCEDteb}hb5*Nc_ZBk(+-<^;mu|!(({&F1S1+Egf`hVP7NlqKNU!aURF_%Y zj(it)BNnQh%eZ|CMEV#9Nrch8vUL(a zfEgEGp_~CG2M}5cX5gGC$j|r?hvno9d$8s0a15z^6b^ika*s!+FU(McomMS3=~d! z*FYK#?7nY{&@tiFmpTU%%m~ZKT7z56h{?c$tT0tPWK*LsGX-48tSnP>M@49zaAFQ`5|=!NMUexWi68TQn(m$z&YedU~30D zg;Z<^llJDxc@E4tAvJI2wer_GsgJEZ&GPVV+^qb0D1G9sj79u_d;bb#VwH}YQe;Q$ z8x>H6P)S#rTjiL|LT<@+5M{7bigWtIN*yKETvm zfahLe6RO?#%0^ew;AsmvOu~9nB;p`GBfAuSNIHtOTNor9K;BRGVjbJ)Bw+O-mGgRWqWu=!Z z*j~gO9`t{8`X))OyiS>S!_l?-Tc@Hi$DF;0{TU;mg# zVNb%$p8FWsl4T+z(@9_>3rYgu5z4@9(I3cM(ET9q_?4@rageXiI7>Ry+usje_Yz_G z4o!EcEtl}7KZ~t&`Am1lgU_wJbKd)aBA4soH-gPfI;L*xL*wkOeG@(b8R$qfzn3f; zh6pBbMLi-gA7{LpVWhCKMI-B7R@0&SfVTC^dxWL+Im^GwpQw!zL_0R;V6z)=Sr`^O zK_=_3TO6N@5wYpp^&?#eqA;<1|X4VQ_==StY7MMuS@= z3bm*O{UDl`Tfp%5ALfq6vLPltN=t6aGQ{VOC=qW=zz(NR}x)o0B8^nTo zegWzKt+9_8q3Ax`(v<$n1%%3-Mhp$_|98AnoksszGGI-%q~Df?6R6$}Rey?;#>b^X z`mNJk2}g>VA51{)Pb~?4Kcu}gp&KX2xorg0V_9_+@}`qy{6hV`tTu=HG_IrTf-Oso zJ*>8;>xA>9PQcXplewx6t`LfzR6eJdj??UGe_fOAU_zH<97gi_iJN_8Ahv=qGgJvW z^73<%bK;`ER}42IlEy9PbbiFKXHW!_E)k6sdFaL@9Vd})EQrYrRmAxBY4x_4OUJ2n z=aZ=hH9BPWI{!Vcz z4F(B<%{ST)>F4id-kVrLduLN`It&LXT5K2OhlUxA+CLtAjIG9&h9{9~fvF{Ynh~2p z*I(m;pSoi9%Y^$xxY=S4_NU6yc;-JlXPJ6Tnonb{p87RXUfa^?=RHy+#4i_Y9L(te zVDPfS_%AB}S7dm`EgDOFJX31^sIlHIgi7FwMjDR)#jX@&7K5C?R_{?)b^Z5M79_BC zJFrj}Wu*VT_yeD_&%#7$XZ;u0} zxJ5Sqa*ie?61bPBtPC24GRpHpIXi1^NrP`>Dh@!yr28b*ibDyE=*$7mk*NRC_dI>O8w5s3$`v|kQFe2&N_(p~OAh-Vz;G*NO2ZG^qgWg?= zF3K?+J@JltIZ+F_Cn{f`Mq`cGDXT_HQu2ZaF+)8tfH5-5*RH;)uRqIl<4-mOX4Tn& z_%x30BQRT4 z{1SDN6#8FsQ4ZuEo)W17>xz;o`DZ|a{QbQOYM~&63HW>N>Y?^IT_&~IPEGPum4uyA zD&V=~=tRdwEATdA|^NAuGlvXpF(fj4*lM z`w7gMI?iidsPM(AxUMD6xDimwlsDoahg}I}Spb6wOuu6_>~&pVD&(Zfvge`b_{j`$ z{F`5cAN9WGa>;}ECW}j+(s+;(lewP?9g}i{O%PZmg@`eM*es z#EP1!U*Qjf|Cy=SW>G0K92}_@@WDd=?!ZGD*BRW1f$aT9MYG7q{;48{<`cMJj0Pay{cW_=OqhVik z%+F1W!7#}RM~B(b@Iuhb}RjtUg83zhrW5QjtAFUDx8 z(~7aT-Jm-Hu14RS>5$w$9)|RXlTsc#%{9ez9&yD@%gE3%aC(|JPUE2C#DW6{(({35 z9h@j|&VGVhzTqgR!23@y>bmwr4#Declk8eh%;*x)v{zKJp=xv;opy79@4k8c!*TMn zhJUPhvylZzAygv&A4e$-r96;^Xk0r3Os5y%HaZiet>p5E?b@^F)?X*`Cf_A69M*8& z6xUU({Q2~XXdv#@2dL?lf7d1RCllab6k-Bad2ERC6}6RHzOKLwCi6{0y<&U~`yD)^ zE}@1TTg8&oMZ^i7h)0I0#fC=HP^N|(Uw50*rdcm@-)frjz|oDSG$ILPxuwr@mM2R_ zKF6(dY1evvDsPtJ?<8m z0^-R8sD{s-H@+egF`2t{T;#a@^|V{HaxahGDqXDrdD(Ndsy`#SfZmfV{$kZRqjRqD z#;F9nXRjXTi!@JId&fIAOfZ*=sKprh--}TS+CJX|kR9u>;o-wJw}kYm2X8i{DRt(3 zF!i_kR-uhI+ZU5BzY$g*d`RVqd^+)A?8YUDU*f<-_|YR)vMs`2Zw>? zoZ|H!cUBy?2i*oZc_iz;)YY9qST)|cz87Tahhlz!j!ev?gD*wBw@3#tp5iEg`j9(; z`0Ni*b@x1)8wSjSqGt~$<7bO9qy(10B72ftm!$f8E(G_Z5OZv^2Y*$bwPmI)Mm_Gj)E4g&ypS}12VE#K@G3B_g+!KCiT|3VXwm!ANg*nW9{ok z@et6Kn@@BAy{aORCYISW9%(l2bIMl z(XI39>te^FW|@+@P9u>M%}(|z_%$T;-U$dRNq(XM2S|Kg`IAP(KBrgWVl!S0g)7eA z>@*xa-vaQwul84f<_QD!J80GZ>`RJ$C}<{7#*B2FFio%k5{XvfoyL&#NAE@2yN3zCB7)uuS-z!5@mE;K_bUW6o37)N-ZQ0RH?nzA2T2I7oI6 z>?zbjpg?VJ4yM|#HvuGnKGElWcgH{JzNrdx5UTzl)$O=8$U&lJp7Jipdp{-}v+Xq? z?~H*uM?OMfTmTJ?PFz_|8l|<6Ls2G}U-JI60dgcMX6vT26;Xg~AIei; z5nczAxO*j$$nQ@t=i*lF!1jpMW(U3iSo(L*($#TIGojq)z*&Iv7X#7?Tx_dSqt(r= zm;n^2BFTPxqt0|ZT;#QX5aOnVB?SAyKdCp|Bk~T1Vjp9ji(dt6$Fs!y%YNz|Kgx~r zW7QhKmw8HMprZ~FNBe6=$lS`Cn4t~c9A1P?-EurLn*_l@ztJqThZf3A^l}v zM0f{KWQYO=hF(ZAgl~>D5L@jnw)6RQz9OW1ptRF;Q4GjW9A7Yq=pVinmNp$&vSJXP ze3Ko4*ZUh-9X}u?@Kd${6)aLc)p^oleIPrS(d$sn>uSS@I3Ollmowedp1JaP{1vfC zYQHt8*R|?181pFb}YFuxNvwciqVXzk_J zL5XT;Il+i=bI9I7uAB0DpAAL@bqh@cukyGB{ z>FeEKNlcH7G*=+k#)&Jb_@Gl~Z_1ow){{gj_jMl&z>6ANyltR-kQAQ?b}BX{bWgC( z96|MI9k}oS5NDBw+e%j+jp||N2UYhBJWy<&PRKT;(!Ca_=`>*gp!V7IMg}vw zbA4cT>x;pMP6JY2Dg8D>X{eQ;Jf~AiGkXRWdxI? zA&~BSf6Dt~g@+6IfAg`+kaLjDXIwlZ{QK8BiR~MDVe^wzr%T1bmZ8KvAdX4`A z)IbcwH^YiR%76AoZ3@F5QLZxzHqU&GFP6LWtG_%ik14ZAS_H--1A#$49LTN`@4r3kRPq7uQ7IA zWbXgaZSt&J=}o22A^gfjT|fTPpV06AAF9{heI8{h5u_0#qYa{doI+?U4xoRURgHCW2WdryIIWyI$7G`NO>xuvy<7a#R%BnVD$Xo*`0X(of~ zc}c)C=}?=U<)I$RTX1$G1#A_p07@CUj1I=`4~`P} zHcJyjUGeY}fUt#<>;OE5M2Q%T$=x%~O_dau=pslSAZ3695(x<-8v^?e8r#}lLbnRN)vAYgq`tXrzM_tivk8>OUo=A zqxD**0&e?#}~ zZQrkeATUDt$R8CZym1A;4Kl*`g$}~tNP$vJ3=32k97k{38Sxrk&xJ*bd{A=lE!g0g z`;&mBD5Ge=1>b8i0Hwqd{0ml3yu<=#F((q>B~JWZ#jQBV&GYy~>5Mcmg-1C(+9-oC zgE)zhJqUb6u(*W;CkNaKGP3>66*Uq0z@Jr8yUMNZ`9bQNOwIn|1XLhqMx9#PxBfdu z2OqAwxW|aH**f^8`fB+mU3f-kv27wP=DIR~x$KXc5WkqB0XY|%Q zMSu*)ei|F)9ugRdRDhLi`kRRC&HDV+H1L@R|DU$5JRHjQ`%5E(Xl!{2qd_4{S<+;i zAu))N@hT~)$Wn;3U<`_}l?V};iRm?_tjX3wma>&7EtCpFgBsb!GWg!l=K>wL=Pz2nOwf|=+ zoRQGA$_Q#fO{zx$y%z9(@GV+Gpg5*_cmeVnUsN~<-nXFG0&H+1fiH}%%e3FJ7E=Ew zFl_vJ@pY?%!r)SpgzqfnV!wQ%6OG%iV$L4<)kGk?jnQ!qk3WJ!)C}|n|Ln2rVbTLw_Sw$r*9c2S&Vhv1S?oE zQx=>IL}EOF3h8GCwRze_V)Eens%>&f0Pril+669M8T9i42O&V9EP!)urNLQpAdtPm zl=eIn9OPvqK7J;&K|PPZ%S$}jAo29>VF6GMg&SfmSRCtL$x47fBUND1?T~%J=hxN% z5$kuQr~}D`Dj<~Z^lg`0y|fzLAP-=a6v0gws`WH@w#QHzKq2R5+(}468-y-5Nz3qT z4=Sy;V4=HxJ}L`Dp9Z5&E#CM51rI1aBS3=!c)QeCNN?b!qx<^x0TWERV4r)alwJmy zf?VH92Nc76FkN%1CEjFl{Jw0K#Os!=rGr^ zH6y(w!}GN0dhlK=pnpuk_VTBY!#cj&$?)WrMC!7W5+c)9a67Bj!fTM;-R-X z8zpEbT$2I&e=mZZe8Ep?Fq%<7+c)*77SsJv>_V@Z{a5%Rj}H=nYwJ*y<+X^ zw4XBZpz^l{N+|5iaojuGQ5BX*YQ!c}D}QAc$u=a8s$r?NmTeeEEsx7eA1r3$7CN_w z1YD&VHOBQMH+<_nfD5zTZIrYTofncqlTig75nZ%^Ir>hVsmqs&?E^zn79tcUmB-pX zr*Su|dkvH9(B0G7C~=MKxeA(SL&ejU6C^a(u{*9b`Qx%lRl9|eym+=cYbXbv-Z-`_ z;EBYwt9+7vIdi>qs>G(2kop>-fPT2QyC`)RNxQ$(Fk0itauT%n^6~dTdEt9Q(S|Pg z#%<4S%OlUU9SO?~wlNVDg;TpQc;F4qchrUcKV81GE zDd5(8k`yj|-B`yFRX$pyPEu^=973SY=I9f>=IW$~G4fX(WR3gIjUM(hQ~hdvh#9u~ zdCgwqVyC~BJj))ckY7HQX{UUBZc%pjv>IKrnCm&9Be=ppWcrNEA8d$QmL7&$r=pm* zhSk9~J#NC=5BZ|ZVJK_}W{x{RPor3JlcvLP&zX0)>7g&nzW9uxy)AHhD(FqD&yC2| zr5sP}(8&F46@^W5qgtqyn^kot5`<-sk8C6Gcz)Sk^PeYo$b4VY7(D}XUK{?G+#WnS zddMC5_F9GCx3})ryREv1Z-XfOaBM^m=U_9sac@d^O}-uba#uDBf1uU!62o zWyNiGl@?MgVAWh`?zDJ1*sj0|vT@&mW#Y?4PP!p}6eM&nX{Qaf9Q5}uyp9(s6?avObXrmE?!Fr{9GlwS&A*f9U=u;!&@i1%TF>+GgU$F; z8`7Av^9y1V=?!5L;lmjfS{v~G2FfWPiVVVP;h0kIX|%ButKn5>xiT9LbQ*<@s{qsQeo zwv|uhMq~TJL|A&hyVy4NHK!2vn8(oFOllB`BqVSnW?$Nmsynp8i_vZD`F0f-#C+ml z5*|O_xvjz7(^PEh!02v4ToA0oQEjDs5bpX$e)*g*bwn!u-dWAzQwQUzZ5d`+qP*-F zzHGrZRDCSBH$2C4@T}R%=X0{nS$n#I356r_R=0XX#cB3Wfm zi23+LSkHVaSCci2d{U>{YSwWhz02Yb<)d{T>7|G7eJ#8#f$#7_=ES*q5%i~>I$lv)*;6Z zEe8!w8(S4PGN6Tc+ujS%xWzxQ#4g<-^0MzU}CUYOHFhe@|ab#W_6x#%vJw+ zk@o1ei%*x!TZ+sFL3xuR&_g13Y4u4MkQ<0sGgk7Ot-wZt4BNX3i+T}iTj=sxpxMl9 zsv2=%8rnvl_bCJCOr8@92%Fd`n5b5j^7Ue_HsbF>YS7N>6d^4}PR$!HkjDAjyeO;YtE5*=gEs zeWUut{zRsZu%U=5Icv%`cDQe&bZww2wt#Q1RvpQzgv&%2i0njqkE5$UJnIX7c3#zj zGorJtU}pY^%Y*ovBSiB9;-%Yn94Qinh?|-oAX@;dyt$6KohKC$8^k&zB9C-<-9M7E zzZ2Vk=*NJRP7qBch~NEFMc>=`i9$&+zbHinnNQoD1g=^SR0f6g<;7UFPQV|YRjh`R?}nm zb|}}5Zpt?DOZ0-!`Wl!7gubk+j!LbfEh-VFyOo~DLY6Jv#5OTV4lWP<$789!r&jb9 zn*a+_eQWR+1jzv?QKMjnK^}P+(qrjxVN)w(*t_SwxSzrFvIfj~9tkhL47v!E=%euL z+rQxN1JpG%w#T@V?4`-IlQDf_SM|7>5sRr)yrqAR^X!v*43*LIoE)+F)n))p#l8-D z@xCS!qYFQ=A8+Z6Bu+_Q2@9{u&15QHlsiuXk21(2cixM{C<2ym%g@Uj5MBmUDTU-8 z5fP&u9$w?6 z#$7$^f-Gw-78NT)I2XflIXu@?t|YzP_u%e2VQhNN2Kfw(5~x@tFo7KCPF~IYs^tCJ zItHk$+%!7><9#3_A})B_^vOePOHSZEk8=|~*|u-z3A^jQ81cvy4^D;x&j`XEaEM^}U*0~0Y!8o$l_coNMEr9mS?Aqp zonpA#wRGbC(?wfh&gQ14GaT?wy5T*S!3^NQrVUNEe+hsuSmwBLhYpXMBG+)hf^^gbBZS}^}k}WyZgn##XzQN<6#n zUJN$>P1gUNnI_;pWk*ZcR5)W{(o6r3LC-*S!k5oonJ!n~YR5b8Th&-;BghvAO5dHw z!<>oWUs?Y*56mF18c-rm5dCuEpVeH-voAsftXj?YV@BYSpC^xGMgI#J(3b(oY5hAm zV_l%G6V%@F%VKd*f6d1683iedg?j=JHn9U$}ab2tA`8mLD|u3uSGP-pg2 TUwdeT5B%UP?e`R$AC3MWB#e<6 diff --git a/prebid-server/overview/prebid-server-overview.md b/prebid-server/overview/prebid-server-overview.md index 493b0a9cfe..5b770d0b1b 100644 --- a/prebid-server/overview/prebid-server-overview.md +++ b/prebid-server/overview/prebid-server-overview.md @@ -8,17 +8,17 @@ sidebarType: 5 # Prebid Server Overview {:.no_toc} -Prebid Server is an open-source solution for server-to-server header bidding. It supports a number of key use cases: [mobile app](/prebid-server/use-cases/pbs-sdk.html), [AMP](/prebid-server/use-cases/pbs-amp.html), [server-side web with Prebid.js](/prebid-server/use-cases/pbs-pbjs.html), and [long-form video](/prebid-server/use-cases/pbs-lfv.html). +Prebid Server is an open-source solution for server-to-server header bidding. It supports a number of key use cases: [mobile app](/prebid-server/use-cases/pbs-sdk.html), [AMP](/prebid-server/use-cases/pbs-amp.html), [server-side web with Prebid.js](/prebid-server/use-cases/pbs-pbjs.html), and server-side ad inclusion scenarios such as [long-form video](/prebid-server/use-cases/pbs-lfv.html) and audio. ![Prebid Server Architecture](/assets/images/flowcharts/prebid-server/pbs-basic-flow.png){:class="pb-xlg-img"} Prebid Server is a header bidding server with a growing list of features. At a high level, it works like this: -1. Prebid Server completes and validates incoming requests +1. Prebid Server validates and enhances incoming requests - Resolves dynamic stored requests - Enforces privacy regulations 2. Next, it calls server-side bid adapters - - There are currently 100+ server-side bid adapters available + - There are 140+ server-side bid adapters available 3. After everyone's responded (or the timeout period has expired), it formulates an appropriate response - Handles currency conversion - Quantizes bids @@ -42,7 +42,13 @@ The simplest route to working with Prebid Server is to sign up for a hosted solu But of course this is open source, so you're welcome to do this on your own. If you decide to implement your own Prebid Server solution, first check out the general [Prebid Server host company overview](/prebid-server/hosting/pbs-hosting.html). -Then you need to decide which of the two implementations to utilize: +Note that Prebid Server is not a turn-key solution. Whoever takes on hosting a Prebid Server also needs to take on: +- Setting up production-quality servers, networking, monitors, etc. +- Populating backend data such as stored requests and account-level configuration +- Responsibility for understanding the legal implications of ad tech in your marketplace. PBS has built-in configurable support for [several privacy regulations](/prebid-server/features/pbs-privacy.html), but you need to understand and configure them with help from your lawyers. +- Regular updates. Please don't download Prebid Server and just run the same version forever. You need to commit to checking **at least** quarterly for updates. There are new releases most every week. + +You'll need to decide which of the two implementations to utilize: - [Prebid Server (Go)](/prebid-server/versions/pbs-versions-go.html) - the original Prebid Server is written in the Go language. - [Prebid Server (Java)](/prebid-server/versions/pbs-versions-java.html) - Prebid Server with a Java language port. From bf1558ac7595285146d22828fd09fa8ff91e7070 Mon Sep 17 00:00:00 2001 From: Demetrio Girardi Date: Wed, 2 Nov 2022 13:00:55 -0700 Subject: [PATCH 083/280] PBJS: document ORTB conversion library (#4049) --- dev-docs/bidder-adaptor.md | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/dev-docs/bidder-adaptor.md b/dev-docs/bidder-adaptor.md index 469b5d79d0..648d7116a3 100644 --- a/dev-docs/bidder-adaptor.md +++ b/dev-docs/bidder-adaptor.md @@ -184,6 +184,7 @@ Prebid recommends keeping module HTTP requests 'simple' if at all possible. The If you're the type that likes to skip to the answer instead of going through a tutorial, see the Full Bid Adapter Example below. + [Overview](#bidder-adaptor-Overview) ++ [Note on ORTB adapters](#ortb-adapters) + [Building the Request](#bidder-adaptor-Building-the-Request) + [Interpreting the Response](#bidder-adaptor-Interpreting-the-Response) + [Registering User Syncs](#bidder-adaptor-Registering-User-Syncs) @@ -238,6 +239,12 @@ registerBidder(spec); {% endhighlight %} + + +### Note on ORTB adapters + +If your adapter interfaces with an ORTB backend, you may take advantage of Prebid's [ORTB conversion library](https://github.com/prebid/Prebid.js/blob/master/libraries/ortbConverter/README.md), which provides most of the implementation for `buildRequests` and `interpretResponse`. + ### Building the Request From 0e8e39b8e48d9423b0786abbdcae84c90a75b364 Mon Sep 17 00:00:00 2001 From: bretg Date: Wed, 2 Nov 2022 16:46:22 -0400 Subject: [PATCH 084/280] PBS audio support (#4123) --- _data/sidebar.yml | 8 ++++++++ prebid-server/developers/add-new-bidder-go.md | 2 +- .../developers/add-new-bidder-java.md | 4 +++- prebid-server/features/pbs-audio.md | 18 ++++++++++++++++++ prebid-server/features/pbs-feature-idx.md | 3 ++- 5 files changed, 32 insertions(+), 3 deletions(-) create mode 100644 prebid-server/features/pbs-audio.md diff --git a/_data/sidebar.yml b/_data/sidebar.yml index 563989cdbd..746980ae74 100644 --- a/_data/sidebar.yml +++ b/_data/sidebar.yml @@ -1941,6 +1941,14 @@ sectionTitle: subgroup: 3 +- sbSecId: 5 + title: Audio + link: /prebid-server/features/pbs-audio.html + isHeader: 0 + isSectionHeader: 0 + sectionTitle: + subgroup: 3 + - sbSecId: 5 title: Caching link: /prebid-server/features/pbs-caching.html diff --git a/prebid-server/developers/add-new-bidder-go.md b/prebid-server/developers/add-new-bidder-go.md index 3e66b4ca1c..f0f745995b 100644 --- a/prebid-server/developers/add-new-bidder-go.md +++ b/prebid-server/developers/add-new-bidder-go.md @@ -1214,7 +1214,7 @@ Notes on the metadata fields: - If you support the GDPR and have a GVL ID, you may add `gdpr_supported: true`. Default is false. - If you support the US Privacy consentManagementUsp module, add `usp_supported: true`. Default is false. - If you support one or more userId modules, add `userId: (list of supported vendors)`. Default is none. -- If you support video and/or native mediaTypes add `media_types: video, native`. Note that display is added by default. If you don't support display, add "no-display" as the first entry, e.g. `media_types: no-display, native`. No defaults. +- If you support video, native, or audio mediaTypes add `media_types: video, native, audio`. Note that display is added by default. If you don't support display, add "no-display" as the first entry, e.g. `media_types: no-display, native`. No defaults. - If you support COPPA, add `coppa_supported: true`. Default is false. - If you support the [supply chain](/dev-docs/modules/schain.html) feature, add `schain_supported: true`. Default is false. - If you support adding a demand chain on the bid response, add `dchain_supported: true`. Default is false. diff --git a/prebid-server/developers/add-new-bidder-java.md b/prebid-server/developers/add-new-bidder-java.md index 37c599308b..ed5f7425d4 100644 --- a/prebid-server/developers/add-new-bidder-java.md +++ b/prebid-server/developers/add-new-bidder-java.md @@ -827,6 +827,8 @@ private static BidderBid createBidderBid(Bid bid, Imp imp, BidType bidType, Stri ```

+2. Test: + ## Test Your Adapter This chapter will guide you through the creation of automated unit and integration tests to cover your bid adapter code. We use GitHub Action Workflows to ensure the code you submit passes validation. You can run the same validation locally with this command: @@ -1268,7 +1270,7 @@ Notes on the metadata fields: - If you support GDPR and have a GVL ID, you may add `gdpr_supported: true`. Default is false. - If you support the US Privacy consentManagementUsp module, add `usp_supported: true`. Default is false. - If you support one or more userId modules, add `userId: (list of supported vendors)`. Default is none. -- If you support video and/or native mediaTypes add `media_types: video, native`. Note that display is added by default. If you don't support display, add "no-display" as the first entry, e.g. `media_types: no-display, native`. No defaults. +- If you support video, native, or audio mediaTypes add `media_types: video, native, audio`. Note that display is added by default. If you don't support display, add "no-display" as the first entry, e.g. `media_types: no-display, native`. No defaults. - If you support COPPA, add `coppa_supported: true`. Default is false. - If you support the [supply chain](/dev-docs/modules/schain.html) feature, add `schain_supported: true`. Default is false. - If you support adding a demand chain on the bid response, add `dchain_supported: true`. Default is false. diff --git a/prebid-server/features/pbs-audio.md b/prebid-server/features/pbs-audio.md new file mode 100644 index 0000000000..23c9e2ecc3 --- /dev/null +++ b/prebid-server/features/pbs-audio.md @@ -0,0 +1,18 @@ +--- +layout: page_v2 +sidebarType: 5 +title: Prebid Server | Features | Audio Support + +--- + +# Prebid Server | Features | Audio Support + +Support for the Audio format in Prebid Server is simple: + +1. Bid adpaters supporting the audio format will see imp.audio objects. It is up to each adapter to pass this to their endpoint appropriately. +1. PBS does no validation on the audio object than enforcing that it's valid ORTB. +1. No audio podding support is currently available. + + +## Related Reading +- [Prebid Native Format](/formats/native.html) diff --git a/prebid-server/features/pbs-feature-idx.md b/prebid-server/features/pbs-feature-idx.md index 426b2b4716..380417a409 100644 --- a/prebid-server/features/pbs-feature-idx.md +++ b/prebid-server/features/pbs-feature-idx.md @@ -23,7 +23,7 @@ title: Prebid Server | Features | [Price Granularity](/prebid-server/endpoints/openrtb2/pbs-endpoint-auction.html#targeting) | Core | Request can define quantization rules. Bids are quantized before being added to ad server targeting. | | | | Price Granularity | Mediatype pricegranularity | Request can define different quantization rules for different mediatypes. Bids are quantized before being added to ad server targeting. | | | | [Bid Adjustments](/prebid-server/endpoints/openrtb2/pbs-endpoint-auction.html#bid-adjustments) | Core | Allows publishers to adjust bid prices to account for gross/net or consistent discrepancies. | | | -| [Bid Adjustments](/prebid-server/endpoints/openrtb2/pbs-endpoint-auction.html#bid-adjustments) | By mediatype | Allows for different bid adjustments by mediatype banner, video, native. | | | +| [Bid Adjustments](/prebid-server/endpoints/openrtb2/pbs-endpoint-auction.html#bid-adjustments) | By mediatype | Allows for different bid adjustments by mediatype banner, video, native, audio. | | | | Price Floors | Core | Support for the [price floors feature](/prebid-server/features/pbs-floors.html). | | | | GDPR | TCF 2 core | Able to: read the TCF2 global vendor list, parse incoming TCF2 consent strings, and [take appropriate enforcement action](https://docs.google.com/document/d/1fBRaodKifv1pYsWY3ia-9K96VHUjd8kKvxZlOsozm8E/edit). | | | | GDPR | TCF 2 Account Config | Able to turn on and off TCF2 enforcement per account. | | | @@ -58,6 +58,7 @@ title: Prebid Server | Features | Video | IAB advertiser category mapping | Able to map IAB advertiser categories to a supplied mapping table. | | | | Video | [Echo video attributes](/prebid-server/endpoints/openrtb2/pbs-endpoint-auction.html#echo-storedrequest-video-attributes) | To support mobile video, copies stored request video attributes to the response. | | | | Mobile App | [Request Passthrough](/prebid-server/endpoints/openrtb2/pbs-endpoint-auction.html#request-passthrough) | Apps can pass render-time parameters from the request through to the response. | | | +| [Audio](/prebid-server/features/pbs-audio.html) | Core | Passes the audio mediatype through to bidders that support audio. | | | | [Native](/prebid-server/features/pbs-native.html) | Core | Passes the native mediatype through to bidders that support native. | | | | Native | asset type preprocessing | If a native bid response doesn't contain asset.type, PBS will link to the asset in the request by ID and copy the type into the response. | | | | [Interstitials](/prebid-server/features/pbs-interstitials.html) | Core | Support device.ext.prebid.interstitial.minwidthperc and device.ext.prebid.interstitial.minheightperc parameters, [dynamically updating the impression format object](https://github.com/prebid/prebid-server/issues/755) from a configurable list of sizes filtered by these parameters. | | | From 63a011b0cd8f387dd904e2761e0669b4e9fcc7c4 Mon Sep 17 00:00:00 2001 From: Jason Quaccia Date: Thu, 3 Nov 2022 06:39:26 -0700 Subject: [PATCH 085/280] updated docs for adRenderSucceeded event (#4124) --- dev-docs/publisher-api-reference/getEvents.md | 2 +- dev-docs/publisher-api-reference/onEvent.md | 3 +++ 2 files changed, 4 insertions(+), 1 deletion(-) diff --git a/dev-docs/publisher-api-reference/getEvents.md b/dev-docs/publisher-api-reference/getEvents.md index 7317475632..247289810b 100644 --- a/dev-docs/publisher-api-reference/getEvents.md +++ b/dev-docs/publisher-api-reference/getEvents.md @@ -37,7 +37,7 @@ The available events are: | requestBids | Bids have been requested from adapters (i.e. pbjs.requestBids() was called) | None | | addAdUnits | Ad units have been added to the auction | None | | adRenderFailed| Ad rendering failed | Object containing 'reason' and 'message' | -| adRenderSucceeded | Ad rendering succeeded| Object containing 'doc', 'bid', and 'adId'. 'doc' is the DOM root containing the ad and may be `null` if it was rendered in a cross-origin iframe.| +| adRenderSucceeded | Ad rendering succeeded| Object containing 'doc', 'bid', and 'adId'. 'doc' is the DOM root containing the ad and may be `null` if it was rendered in a cross-origin iframe. This event indicates that the render function did not generate an error, it does not guarantee that tracking for this event has occurred yet.| | auctionDebug | An error was logged to the console | Object containing 'type' and 'arguments' | | bidderDone | A bidder has signaled they are done responding | Bid request object | | bidderError | A bidder responded with an error | Object with the XMLHttpRequest error and the bid request object `{ error, bidderRequest }` | diff --git a/dev-docs/publisher-api-reference/onEvent.md b/dev-docs/publisher-api-reference/onEvent.md index 6e779971ca..928cd096ca 100644 --- a/dev-docs/publisher-api-reference/onEvent.md +++ b/dev-docs/publisher-api-reference/onEvent.md @@ -14,6 +14,9 @@ This routine allows the page (or module) to create a callback function that's in See the [getEvents](/dev-docs/publisher-api-reference/getEvents.html) function for the full list of eventTypes supported. +{: .alert.alert-info :} +The `adRenderSucceeded` event indicates that the render function did not generate an error, it does not guarantee that tracking for this event has occurred yet. + The optional `id` parameter provides more finely-grained event callback registration. This makes it possible to register callback events for a specific item in the event context. From e71811add4992d8e7ff890b3d0c89c188628063c Mon Sep 17 00:00:00 2001 From: Muki Seiler Date: Thu, 3 Nov 2022 18:04:51 +0100 Subject: [PATCH 086/280] Honor pbjs setting on bidder page #fix 4111 (#4112) --- _layouts/bidder.html | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/_layouts/bidder.html b/_layouts/bidder.html index 71c36e9696..a0a05bbe35 100644 --- a/_layouts/bidder.html +++ b/_layouts/bidder.html @@ -84,7 +84,7 @@

Features

Supports Deals {% if page.deals_supported == false %}no{% elsif page.deals_supported == true %}yes{% else %}check with bidder{% endif %} Prebid.js Adapter - yes + {% if page.pbjs == true %}yes{% else %}no{% endif %} IAB GVL ID From eabee7ac4c9d5755384d1ed548e41cdd0d47f27b Mon Sep 17 00:00:00 2001 From: velichkin Date: Fri, 4 Nov 2022 13:47:29 +0200 Subject: [PATCH 087/280] Mgid RTD module docs (#4081) * native support & some optional params added * native support & some optional params added * native support & some optional params added * make placementId optional * update media types with native support * remove optional placementId from integration code samples * Mgid RTD module docs Co-authored-by: gaudeamus Co-authored-by: Gaudeamus --- dev-docs/modules/mgidRtdProvider.md | 62 +++++++++++++++++++++++++++++ 1 file changed, 62 insertions(+) create mode 100644 dev-docs/modules/mgidRtdProvider.md diff --git a/dev-docs/modules/mgidRtdProvider.md b/dev-docs/modules/mgidRtdProvider.md new file mode 100644 index 0000000000..14c3f146c2 --- /dev/null +++ b/dev-docs/modules/mgidRtdProvider.md @@ -0,0 +1,62 @@ +--- +layout: page_v2 +title: Mgid Realtime Module +display_name: Mgid Realtime Module +description: Mgid RTD module allows you to enrich bid data with contextual and audience signals, based on IAB taxonomies. +page_type: module +module_type: rtd +module_code : mgidRtdProvider +enable_download : true +vendor_specific: true +sidebarType : 1 +--- + +# Mgid Realtime Module +{:.no_toc} + +* TOC +{:toc} + +## Overview +Mgid RTD module allows you to enrich bid data with contextual and audience signals, based on IAB taxonomies. + +## Configuration + +This module is configured as part of the `realTimeData.dataProviders` object. + +{: .table .table-bordered .table-striped } +| Name | Scope | Description | Example | Type | +|------------|----------|----------------------------------------|---------------|----------| +| `name ` | required | Real time data module name | `'mgid'` | `string` | +| `params` | required | | | `Object` | +| `params.clientSiteId` | required | The client site id provided by Mgid. | `'123456'` | `string` | +| `params.timeout` | optional | Maximum amount of milliseconds allowed for module to finish working | `1000` | `number` | + +#### Example + +```javascript +pbjs.setConfig({ + realTimeData: { + dataProviders: [{ + name: 'mgid', + params: { + clientSiteId: '123456' + } + }] + } +}); +``` + +## Integration +To install the module, follow these instructions: + +#### Step 1: Prepare the base Prebid file + +- Option 1: Use Prebid [Download](/download.html) page to build the prebid package. Ensure that you do check *Mgid Realtime Module* module + +- Option 2: From the command line, run `gulp build --modules=mgidRtdProvider,...` + +#### Step 2: Set configuration + +Enable Mgid Real Time Module using `pbjs.setConfig`. Example is provided in Configuration section. + From e136641e5f9cd6a6de4e0e84eac99bf2b14a2562 Mon Sep 17 00:00:00 2001 From: Love Sharma Date: Fri, 4 Nov 2022 10:14:39 -0400 Subject: [PATCH 088/280] docs update for sitId overrides (#4120) Co-authored-by: Love Sharma --- dev-docs/bidders/ix.md | 81 ++++++++++++++++++++++++++++++++++++++++-- 1 file changed, 79 insertions(+), 2 deletions(-) diff --git a/dev-docs/bidders/ix.md b/dev-docs/bidders/ix.md index 8d973166d2..44b0cf5c6c 100644 --- a/dev-docs/bidders/ix.md +++ b/dev-docs/bidders/ix.md @@ -32,6 +32,7 @@ multiformat_supported: yes - [Index's outstream video player](#index-outstream-video-player) - [Prebid Native configuration](#prebid-native-configuration) - [Bid request parameters](#bid-request-parameters) +- [Multi-format ad units](#multi-format-ad-units) - [Examples](#examples) @@ -51,7 +52,15 @@ Publishers can use Prebid.js to call Index Exchange (Index) in any of the follow * Open the **Developer tools**. * In **Developer tools**, click the **Network** tab. * In the **Network** tab, search for requests sent to `casalemedia.com/cygnus` (from version 6.28.0 and earlier) or `casalemedia.com/openrtb/pbjs` (from version 6.29.0 and later). These are the bid requests sent to Index. - +* **Recommended Global Bidder settings:** For our adapter, Index recommends enabling local storage. As of Prebid.js 7.x, local storage access must be explicitly specified. By leveraging local storage, Index is able to take advantage of the latest features our exchange has to offer. For instructions on enabling local storage, see Prebid’s [pbjs.bidderSettings](https://docs.prebid.org/dev-docs/publisher-api-reference/bidderSettings.html) documentation. +Example: +```Javascript + pbjs.bidderSettings = { + ix: { + storageAllowed: true + } +}; +```
@@ -108,7 +117,7 @@ pbjs.setConfig({ 5. (Optional) Set up First Party Data (FPD) using the Index bidder-specific FPD (preferred method) setting or the Prebid FPD module. For more information, see the [Set up First Party Data (FPD)](#set-up-first-party-data-fpd) section below. -6. (Optional) If you want to monetize instream video, you need to enable a cache endpoint in the `[pbjs.setConfig()](https://docs.prebid.org/dev-docs/publisher-api-reference/setConfig.html)` function as follows:
+6. (Optional) If you want to monetize instream video, you need to enable a cache endpoint in the [pbjs.setConfig()](https://docs.prebid.org/dev-docs/publisher-api-reference/setConfig.html) function as follows:
```javascript pbjs.setConfig({ cache: { @@ -389,6 +398,19 @@ If you are using Index's outstream player and have placed the video object at th Index supports the same set of native assets that Prebid.js recognizes. For the list of native assets, see [Prebid.js Native Implementation Guide on the Prebid site.](https://docs.prebid.org/prebid/native-implementation.html#3-prebidjs-native-adunit-overview) +
+## Multi-format ad units +Index supports multi-format ad units, see [Show Multi-Format Ads with Prebid.js](https://docs.prebid.org/dev-docs/show-multi-format-ads.html). For multi-format ad units, you can optionally specify a different siteId for each multi-format type at the bidder level. This is useful if you have deals set up with Index at the siteId level. See multi-format examples [here](#examples). + +The following are the parameters that you can specify for each multi-format type at the bidder level. +| Key | Scope | Type | Description | +|---|---|---|---| +| `siteId` | Required | String | An Index-specific identifier that is associated with this ad unit. This is similar to a placement ID or an ad unit ID that some other modules have. For example, `'3723'`, `'6482'`, `'3639'`.

Note: This will also act as the default siteID for multi-format adunits if a format specific siteId is not provided.| +| `banner.siteId` | Optional | String | An Index-specific identifier that is associated with this ad unit. This siteId will be prioritized over the default siteID for `banner` format in the multi-format ad unit.| +| `video.siteId` | Optional | String | An Index-specific identifier that is associated with this ad unit. This siteId will be prioritized over the default siteID for `video` format in the multi-format ad unit.| +| `native.siteId` | Optional | String | An Index-specific identifier that is associated with this ad unit. This siteId will be prioritized over the default siteID for `native` format in the multi-format ad unit.| + + ## Examples @@ -540,3 +562,58 @@ pbjs.addAdUnits({ }); ``` + +**Multi-format SiteId Overrides** +```javascript +var adUnits = [{ + code: slot.code, + mediaTypes: { + + banner: { + sizes: [300,250] + }, + native: { + title: { + required: false + }, + image: { + required: true + }, + sponsoredBy: { + required: false + }, + body: { + required: false + } + }, + + video: { + playerSize: sizes, + context: 'outstream', + api:[2], + protocols: [2, 3, 5, 6], + minduration: 5, + maxduration: 30, + mimes: ['video/mp4','application/javascript'] + } + }, + bids: [ + { + bidder: 'ix', + params: { + siteId: '1111', + video: { + siteId: '2222' + }, + native: { + siteId: '3333' + }, + banner: { + siteId: '4444' + } + } + }, +] +}]; + +``` \ No newline at end of file From 87284098e2a1042364c4eb57d733382a8d8ab7e1 Mon Sep 17 00:00:00 2001 From: Fatih Kaya Date: Fri, 4 Nov 2022 17:14:58 +0300 Subject: [PATCH 089/280] AdMatic Bidder PR Doc (#4118) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit * AdMatic Bidder PR Doc https://github.com/prebid/Prebid.js/pull/9133 * Update admatic.md * Update admatic.md * Update admatic.md * Pixad Bidder PR Doc https://github.com/prebid/Prebid.js/pull/9133 ## 🏷 Type of documentation - [X] new bid adapter - [ ] update bid adapter - [ ] new feature - [ ] text edit only (wording, typos) - [ ] bugfix (code examples) - [ ] new examples ## 📋 Checklist - [ ] Related pull requests in prebid.js or server are linked - [X] For new adapters check [https://github.com/prebid/Prebid.js/pull/9133]) * Revert "Pixad Bidder PR Doc" This reverts commit d4a52f832bc355dab840df4f78da2addea01ff82. --- dev-docs/bidders/admatic.md | 64 +++++++++++++++++++++++++++++++++++++ 1 file changed, 64 insertions(+) create mode 100644 dev-docs/bidders/admatic.md diff --git a/dev-docs/bidders/admatic.md b/dev-docs/bidders/admatic.md new file mode 100644 index 0000000000..920991a202 --- /dev/null +++ b/dev-docs/bidders/admatic.md @@ -0,0 +1,64 @@ +--- +layout: bidder +title: AdMatic +description: Prebid AdMatica Bidder Adapter. +pbjs: true +biddercode: admatic +media_types: banner,video +gdpr_supported: false +usp_supported: false +coppa_supported: false +schain_supported: false +dchain_supported: false +userIds: criteo, id5Id, sharedId, unifiedId +safeframes_ok: true +floors_supported: false +multiformat_supported: will-bid-on-any +--- + +### Description + +AdMatic header bidding adapter connects with AdMatic demand sources to fetch bids for banner network ID. Please reach out to your account manager or for more information. + +### Bid params + +| Name | Scope | Description | Example | Type | +|--------------|----------|------------------------------------|------------|----------| +| `networkId` | required | The network ID from AdMatic | `12345` | `number` | + +### Test Parameters + +300x250 banner test +``` +var adUnits = [{ + code: 'your-slot_1-div', //use exactly the same code as your slot div id. + sizes: [[300, 250]], + bids: [{ + bidder: 'admatic', + params: { + networkId: 12345 + } + }] +},{ + code: 'your-slot_2-div', //use exactly the same code as your slot div id. + sizes: [[600, 800]], + bids: [{ + bidder: 'admatic', + params: { + networkId: 12345 + } + }] +}]; +``` + +## UserSync example + +``` +pbjs.setConfig({ + userSync: { + iframeEnabled: true, + syncEnabled: true, + syncDelay: 1 + } +}); +``` From 7a69f240722a82ed5cfb112757de6a2744673298 Mon Sep 17 00:00:00 2001 From: Love Sharma Date: Sat, 5 Nov 2022 17:56:37 -0400 Subject: [PATCH 090/280] table rendering fix for multi-format siteid overrides (#4129) Co-authored-by: Love Sharma --- dev-docs/bidders/ix.md | 13 ++++++++----- 1 file changed, 8 insertions(+), 5 deletions(-) diff --git a/dev-docs/bidders/ix.md b/dev-docs/bidders/ix.md index 44b0cf5c6c..480c84db8a 100644 --- a/dev-docs/bidders/ix.md +++ b/dev-docs/bidders/ix.md @@ -54,11 +54,11 @@ Publishers can use Prebid.js to call Index Exchange (Index) in any of the follow * In the **Network** tab, search for requests sent to `casalemedia.com/cygnus` (from version 6.28.0 and earlier) or `casalemedia.com/openrtb/pbjs` (from version 6.29.0 and later). These are the bid requests sent to Index. * **Recommended Global Bidder settings:** For our adapter, Index recommends enabling local storage. As of Prebid.js 7.x, local storage access must be explicitly specified. By leveraging local storage, Index is able to take advantage of the latest features our exchange has to offer. For instructions on enabling local storage, see Prebid’s [pbjs.bidderSettings](https://docs.prebid.org/dev-docs/publisher-api-reference/bidderSettings.html) documentation. Example: -```Javascript - pbjs.bidderSettings = { - ix: { - storageAllowed: true - } +```javascript +pbjs.bidderSettings = { + ix: { + storageAllowed: true + } }; ``` @@ -403,6 +403,9 @@ Index supports the same set of native assets that Prebid.js recognizes. For the Index supports multi-format ad units, see [Show Multi-Format Ads with Prebid.js](https://docs.prebid.org/dev-docs/show-multi-format-ads.html). For multi-format ad units, you can optionally specify a different siteId for each multi-format type at the bidder level. This is useful if you have deals set up with Index at the siteId level. See multi-format examples [here](#examples). The following are the parameters that you can specify for each multi-format type at the bidder level. + +{: .table .table-bordered .table-striped } + | Key | Scope | Type | Description | |---|---|---|---| | `siteId` | Required | String | An Index-specific identifier that is associated with this ad unit. This is similar to a placement ID or an ad unit ID that some other modules have. For example, `'3723'`, `'6482'`, `'3639'`.

Note: This will also act as the default siteID for multi-format adunits if a format specific siteId is not provided.| From da3d31e0c71c8970b90797d57919128f2cbc07cb Mon Sep 17 00:00:00 2001 From: bretg Date: Mon, 7 Nov 2022 10:14:22 -0500 Subject: [PATCH 091/280] PBS hosting updates (#4132) --- prebid-server/hosting/pbs-database.md | 91 ++++++++++++------- prebid-server/hosting/pbs-hosting.md | 36 ++++++-- .../overview/prebid-server-overview.md | 15 +-- 3 files changed, 84 insertions(+), 58 deletions(-) diff --git a/prebid-server/hosting/pbs-database.md b/prebid-server/hosting/pbs-database.md index 08efe50163..0e3a344d8e 100644 --- a/prebid-server/hosting/pbs-database.md +++ b/prebid-server/hosting/pbs-database.md @@ -2,14 +2,30 @@ layout: page_v2 sidebarType: 5 title: Prebid Server | Developer | Database - --- # Prebid Server Database +{:.no_toc} + +* TOC +{:toc} + +## Overview + +Companies looking to spin up Prebid Server should consider setting up a database. +It could actually be file-based or no-sql based, but for the purposes of this reference, we'll assume a relational DB. +Here are the kinds of data that PBS needs from a data store: +- **account data:** defaults and settings for things like price granularities, time-to-live, privacy regulations, and modules. +- [stored requests](/features/pbs-storedreqs.html): blocks of JSON that define how PBS responds to mobile and AMP requests. +- **stored responses:** very useful for debugging + +**Where does this data come from?** You, the host company need to figure that out. PBS never writes this data, only reads it. The difference between a good PBS host company and an average one will be in details like the managing of this data. -Companies looking to spin up Prebid Server will need to connect a database. Our design -strategy was to avoid a fixed schema, instead allowing each host company the flexibility -to define their schema any way they'd like. +**What's the schema?** Our design +strategy is to avoid a fixed schema, instead allowing each host company the flexibility +to define their schema any way they'd like. The vision is that you already have a database +somewhere attached to a user interface that collects similar data from your users. We want +you to be able to integrate a few tables into that existing database and then replicating them to high-speed read-only copies wherever you have clusters. So instead of Prebid defining your schema, we just define the fields that need to come from the query. You can then design the SQL query and put it in PBS configuration. @@ -23,8 +39,8 @@ Prebid Server queries the database in the following scenarios: |------+---------------+-------------| | Stored Requests | settings.database.stored-requests-query | Retrieve stored request JSON for incoming OpenRTB | | AMP Stored Requests | settings.database.amp-stored-requests-query | Retrieve stored request JSON for incoming AMP | -| Stored Responses (PBS-Java only) | settings.database.stored-responses-query | (PBS-Java only) Retrieve stored response data | -| Account Data | (none) | Retrieve host company-specific account information | +| Stored Responses | settings.database.stored-responses-query | Retrieve stored response data | +| Account Data | settings.database.account-query (PBS-Java only) | Retrieve host company-specific account information | ## Expected Response Fields @@ -52,6 +68,10 @@ settings: stored-requests-query: SELECT uuid, config, 'request' as dataType FROM stored_requests WHERE uuid IN (%REQUEST_ID_LIST%) UNION ALL SELECT uuid, config, 'imp' as dataType FROM stored_requests WHERE uuid IN (%IMP_ID_LIST%) ``` +This example assumes that the schema includes these fields: +- uuid is a string field that contains the stored request ID +- config is a JSON field that contains the body of the stored request + Again, you can name the fields however you'd like in your database, and the query can be arbitrarily complicated as long as it returns the fields in the order and types shown here. ### AMP Stored Requests @@ -67,9 +87,15 @@ settings: stored-requests-query: SELECT uuid, config, 'request' as dataType FROM stored_requests WHERE uuid IN (%REQUEST_ID_LIST%) ``` +This example assumes that the stored_requests schema includes these fields: +- uuid is a string field that contains the stored request ID +- config is a JSON field that contains the body of the stored request + +Again, you can name the fields however you'd like in your database, and the query can be arbitrarily complicated as long as it returns the fields in the order and types shown here. + ### Stored Responses -(PBS-Java only) The Stored Response query needs to return fields in this order: +The Stored Response query needs to return fields in this order: {: .table .table-bordered .table-striped } | Field Num | Name | Type | Meaning | Default | @@ -88,20 +114,22 @@ settings: type: mysql stored-responses-query: SELECT resid, responseData FROM stored_responses WHERE resid IN (%RESPONSE_ID_LIST%) ``` + +This example assumes that the stored_responses schema includes these fields: +- resid is a string field that contains the stored response ID +- responseData is a JSON field that contains the body of the stored response ### Account Data {: .alert.alert-info :} -Despite what we said about Prebid not defining your schema, it's not true for account data. -Currently the account query is hard-coded in both versions of Prebid-Server. You could -create a view as desired. We'll fix this someday. +PBS-Go does not currently support putting account data in the DB, only files and an HTTP interface. Account data is queried on every request to pull in important data. There is an LRU cache in the server so the database isn't actually hit on every request. In PBS-Java, many account-configuration options come from the database. In PBS-Go, those options are available in either a YAML configuration or from an HTTP API. -In both versions the server can optionally validate the account against this database and reject accounts from +In both versions the server can optionally validate the account and reject accounts from unknown sources. The algorithm the server uses for determining the account ID of the incoming request is: @@ -110,31 +138,26 @@ The algorithm the server uses for determining the account ID of the incoming req 2. look in app.publisher.id 3. if AMP, look for the 'account' parameter on the query string -Here are the fields the server can recognize in the database response: +One parameter can be passed into the query: + +- %ACCOUNT_ID% : selects the right row in the DB -{: .table .table-bordered .table-striped } -| Field Num | Name | Type | Meaning | Default | -|-----------+------+-----+---------+---------| -| 1 | uuid | string | Host-company specific account ID | n/a | -| 2 | price_granularity | enum | Deprecated. Granularity should be part of stored requests or the incoming OpenRTB. | n/a | -| 3 | banner_cache_ttl | integer | (PBS-Java only) How long (seconds) banner bids should be cached for this account. | Config | -| 4 | video_cache_ttl | integer | (PBS-Java only) How long (seconds) VAST should be cached for this account. | Config | -| 5 | events_enabled | 0 or 1 | (PBS-Java only) Whether to emit event URLs for this account. | 0 | -| 6 | enforce_ccpa | 0 or 1 | (PBS-Java only) Whether to enforce US-Privacy rules for this account. | Config | -| 7 | enforce_gdpr | 0 or 1 | (PBS-Java only) Whether to enforce TCF1 GDPR rules for this account. Deprecated. Use tcf_config for TCF2. | Config | -| 8 | tcf_config | JSON | (PBS-Java only) TCF2 override settings for this account. | Config | -| 9 | analytics_sampling_factor | tiny int | (PBS-Java only) Turns on analytics sampling for this account. Sampling mechanism is 1-in-N. e.g. if this value is a 2, it's a 1-in-2 (50%) sample. If 5, then 1-in-5 (20%). Max value is 100 (1%) | 1 | -| 10 | truncate_target_attr | tiny int | (PBS-Java only) Number of bytes allowed for targeting attributes for this account. 0=unlimited. | Config | - -Currently this query is hard-coded in both versions of Prebid-Server: - -PBS-Go: +In PBS-Java, the query is configurable. For example: ``` -SELECT uuid, price_granularity FROM accounts_account where uuid = ? LIMIT 1 +settings: + database: + account-query: JSON_MERGE_PATCH(JSON_OBJECT( 'id', accountId ), COALESCE(config, '{}')) as consolidated_config FROM accounts WHERE accountId = %ACCOUNT_ID% LIMIT 1 ``` -PBS-Java -``` -SELECT uuid, price_granularity, banner_cache_ttl, video_cache_ttl, events_enabled, enforce_ccpa, tcf_config, analytics_sampling_factor, truncate_target_attr FROM accounts_account where uuid = ? LIMIT 1 -``` +This example assumes that the accounts schema includes these fields: +- accountId is a string field that contains the account ID +- config is a JSON field that contains all the rest of the account-level fields + +Again, you can name the fields however you'd like in your database, and the query can be arbitrarily complicated as long as it returns the fields in the order and types shown here. + +See the [PBS-Java configuration docs](https://github.com/prebid/prebid-server-java/blob/master/docs/application-settings.md#configuration-document-json) for detail on the JSON structure expected as the +result of the query. There are many account-level settings detailed there. +## Related Reading +- [Stored Requests](/features/pbs-storedreqs.html) +- [Hosting a PBS cluster](/prebid-server/overview/prebid-server-overview.md) diff --git a/prebid-server/hosting/pbs-hosting.md b/prebid-server/hosting/pbs-hosting.md index 5d45bdc8cf..fefb493c10 100644 --- a/prebid-server/hosting/pbs-hosting.md +++ b/prebid-server/hosting/pbs-hosting.md @@ -11,25 +11,41 @@ title: Prebid Server | Hosting * TOC {:toc} -Spinning up a self-hosted cluster of Prebid Servers requires some up-front-planning. -The components that will be needed are highlighted in this hardware +## Overview + +Prebid Server is not a turn-key solution. Whoever takes on hosting a Prebid Server is also taking on: +- Setting up production-quality servers, networking, monitors, etc. +- Populating backend data such as stored requests and account-level configuration +- Responsibility for understanding the legal implications of ad tech in your marketplace. PBS has built-in configurable support for [several privacy regulations](/prebid-server/features/pbs-privacy.html), but you need to understand and configure them with help from your lawyers. +- Regular updates. Please don't download Prebid Server and just run the same version forever. You need to commit to checking **at least** quarterly for updates. There are new releases most every week. + +You'll need to decide which of the two implementations to utilize: + +- [Prebid Server (Go)](/prebid-server/versions/pbs-versions-go.html) - the original Prebid Server is written in the Go language. +- [Prebid Server (Java)](/prebid-server/versions/pbs-versions-java.html) - Prebid Server with a Java language port. + +To choose between them, see the [Prebid Server version overview](/prebid-server/versions/pbs-versions-overview.html) and the [FAQ](/faq/prebid-server-faq.html#why-are-there-two-versions-of-prebid-server-are-they-kept-in-sync). + +## Components + +The components required to support a PBS cluster are highlighted in this hardware layout diagram: ![Prebid Server Hardware Layout](/assets/images/prebid-server/pbs-hardware-layout.png){:class="pb-xlg-img"} -## Global Load Balancer +### Global Load Balancer Assuming you need to serve more than one geographic region, you'll need to utilize a Global Load Balaning service so your users will hit the servers in the region closest to them. -## Regional Load Balancers +### Regional Load Balancers Once the users have come into their nearest server cluster, a load balancer will direct them in one of two ways: 1. If the URI of the request contains `/cache`, they should be directed to one of the Prebid Cache servers. 2. Otherwise, all other endpoints should be forwarded to one of the Prebid Servers. -## Prebid Servers +### Prebid Servers These servers will have a mix of network and CPU work. They benefit from a fair amount of memory so they can cache stored requests @@ -42,17 +58,17 @@ Other services you may want to run alongside Prebid Server are: Note that neither Prebid Server nor Prebid Cache supports configuring an SSL certificate. It's intended that they run behind a load balancer or proxy server (e.g. nginx) that provides SSL. -## Prebid Cache Servers +### Prebid Cache Servers The PBC servers consume very little CPU or memory - they just translate between Prebid protocols and the chosen No-SQL system that implements the storage cluster. -## Storage Clusters +### No-SQL Clusters -You can setup Redis, Aerospike, or Cassandra. How many you need will +This is where Prebid Cache stores its data. You can choose Redis, Aerospike, or Cassandra. How many you need will depend on the expected traffic, your traffic mix, and the average length of time that objects are cached. -## Replicated Database +### Replicated Database Account information and StoredRequests are stored in a [database](/prebid-server/hosting/pbs-database.html) queried by Prebid Server at runtime. @@ -65,7 +81,7 @@ Note that there aren't any open source tools for populating this database. Each PBS host company establishes their own methods of populating data from their internal systems. -## Metrics System +### Metrics System You'll want to hook both Prebid Server and Prebid Cache up to an operational monitoring system. diff --git a/prebid-server/overview/prebid-server-overview.md b/prebid-server/overview/prebid-server-overview.md index 5b770d0b1b..9b10da7266 100644 --- a/prebid-server/overview/prebid-server-overview.md +++ b/prebid-server/overview/prebid-server-overview.md @@ -40,20 +40,7 @@ The simplest route to working with Prebid Server is to sign up for a hosted solu ### DIY -But of course this is open source, so you're welcome to do this on your own. If you decide to implement your own Prebid Server solution, first check out the general [Prebid Server host company overview](/prebid-server/hosting/pbs-hosting.html). - -Note that Prebid Server is not a turn-key solution. Whoever takes on hosting a Prebid Server also needs to take on: -- Setting up production-quality servers, networking, monitors, etc. -- Populating backend data such as stored requests and account-level configuration -- Responsibility for understanding the legal implications of ad tech in your marketplace. PBS has built-in configurable support for [several privacy regulations](/prebid-server/features/pbs-privacy.html), but you need to understand and configure them with help from your lawyers. -- Regular updates. Please don't download Prebid Server and just run the same version forever. You need to commit to checking **at least** quarterly for updates. There are new releases most every week. - -You'll need to decide which of the two implementations to utilize: - -- [Prebid Server (Go)](/prebid-server/versions/pbs-versions-go.html) - the original Prebid Server is written in the Go language. -- [Prebid Server (Java)](/prebid-server/versions/pbs-versions-java.html) - Prebid Server with a Java language port. - -To choose between them, see the [Prebid Server version overview](/prebid-server/versions/pbs-versions-overview.html) and the [FAQ](/faq/prebid-server-faq.html#why-are-there-two-versions-of-prebid-server-are-they-kept-in-sync). +But of course this is open source, so you're welcome to do this on your own. If you'd like to explore implementing your own Prebid Server solution, check out the [Prebid Server host company overview](/prebid-server/hosting/pbs-hosting.html). Be warned that installing PBS is not nearly as easy as Prebid.js. ## Which Server-Side Bidders to Utilize From 693100cf2f9cfb109ca2f53556694d3e57ec68b3 Mon Sep 17 00:00:00 2001 From: bretg Date: Tue, 8 Nov 2022 16:26:53 -0500 Subject: [PATCH 092/280] fix sharethrough table formatting (#4136) --- dev-docs/bidders/sharethrough.md | 1 + 1 file changed, 1 insertion(+) diff --git a/dev-docs/bidders/sharethrough.md b/dev-docs/bidders/sharethrough.md index 3e5fae1757..5f0612c82f 100644 --- a/dev-docs/bidders/sharethrough.md +++ b/dev-docs/bidders/sharethrough.md @@ -25,6 +25,7 @@ This adapter is known to use an HTTP 1 endpoint. Header bidding often generates The Sharethrough bidder adapter requires additional setup and approval from the Sharethrough Integrations team. Please reach out to your account manager for more information to start using it. ### Bid Params + {: .table .table-bordered .table-striped } | Name | Scope | Description | Example | Type | |-------------|----------|------------------------------------------------------------|------------------------------|----------------------| From 9938c9b45ae5cae78cb5716b9c5474b509ef6430 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Tue, 15 Nov 2022 05:16:19 -0700 Subject: [PATCH 093/280] Bump loader-utils and resolve-url-loader (#4145) Bumps [loader-utils](https://github.com/webpack/loader-utils) to 1.4.2 and updates ancestor dependency [resolve-url-loader](https://github.com/bholloway/resolve-url-loader/tree/HEAD/packages/resolve-url-loader). These dependencies need to be updated together. Updates `loader-utils` from 1.4.0 to 1.4.2 - [Release notes](https://github.com/webpack/loader-utils/releases) - [Changelog](https://github.com/webpack/loader-utils/blob/v1.4.2/CHANGELOG.md) - [Commits](https://github.com/webpack/loader-utils/compare/v1.4.0...v1.4.2) Updates `resolve-url-loader` from 3.1.0 to 5.0.0 - [Release notes](https://github.com/bholloway/resolve-url-loader/releases) - [Changelog](https://github.com/bholloway/resolve-url-loader/blob/v5/packages/resolve-url-loader/CHANGELOG.md) - [Commits](https://github.com/bholloway/resolve-url-loader/commits/5.0.0/packages/resolve-url-loader) --- updated-dependencies: - dependency-name: loader-utils dependency-type: indirect - dependency-name: resolve-url-loader dependency-type: direct:development ... Signed-off-by: dependabot[bot] Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- package-lock.json | 673 +++++++++------------------------------------- package.json | 2 +- 2 files changed, 122 insertions(+), 553 deletions(-) diff --git a/package-lock.json b/package-lock.json index 13c6d55aa4..714c6343ce 100644 --- a/package-lock.json +++ b/package-lock.json @@ -20,7 +20,7 @@ "browser-sync-webpack-plugin": "^2.0.1", "cross-env": "^7.0.2", "laravel-mix": "^5.0.7", - "resolve-url-loader": "^3.1.0", + "resolve-url-loader": "^5.0.0", "sass": "^1.27.0", "sass-loader": "^8.0.2", "vue-template-compiler": "^2.6.12" @@ -1368,84 +1368,30 @@ } }, "node_modules/adjust-sourcemap-loader": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/adjust-sourcemap-loader/-/adjust-sourcemap-loader-2.0.0.tgz", - "integrity": "sha512-4hFsTsn58+YjrU9qKzML2JSSDqKvN8mUGQ0nNIrfPi8hmIONT4L3uUaT6MKdMsZ9AjsU6D2xDkZxCkbQPxChrA==", - "dev": true, - "dependencies": { - "assert": "1.4.1", - "camelcase": "5.0.0", - "loader-utils": "1.2.3", - "object-path": "0.11.4", - "regex-parser": "2.2.10" - } - }, - "node_modules/adjust-sourcemap-loader/node_modules/assert": { - "version": "1.4.1", - "resolved": "https://registry.npmjs.org/assert/-/assert-1.4.1.tgz", - "integrity": "sha1-mZEtWRg2tab1s0XA8H7vwI/GXZE=", - "dev": true, - "dependencies": { - "util": "0.10.3" - } - }, - "node_modules/adjust-sourcemap-loader/node_modules/camelcase": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-5.0.0.tgz", - "integrity": "sha512-faqwZqnWxbxn+F1d399ygeamQNy3lPp/H9H6rNrqYh4FSVCtcY+3cub1MxA8o9mDd55mM8Aghuu/kuyYA6VTsA==", - "dev": true, - "engines": { - "node": ">=6" - } - }, - "node_modules/adjust-sourcemap-loader/node_modules/emojis-list": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/emojis-list/-/emojis-list-2.1.0.tgz", - "integrity": "sha1-TapNnbAPmBmIDHn6RXrlsJof04k=", - "dev": true, - "engines": { - "node": ">= 0.10" - } - }, - "node_modules/adjust-sourcemap-loader/node_modules/inherits": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.1.tgz", - "integrity": "sha1-sX0I0ya0Qj5Wjv9xn5GwscvfafE=", - "dev": true - }, - "node_modules/adjust-sourcemap-loader/node_modules/json5": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/json5/-/json5-1.0.1.tgz", - "integrity": "sha512-aKS4WQjPenRxiQsC93MNfjx+nbF4PAdYzmd/1JIj8HYzqfbu86beTuNgXDzPknWk0n0uARlyewZo4s++ES36Ow==", + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/adjust-sourcemap-loader/-/adjust-sourcemap-loader-4.0.0.tgz", + "integrity": "sha512-OXwN5b9pCUXNQHJpwwD2qP40byEmSgzj8B4ydSN0uMNYWiFmJ6x6KwUllMmfk8Rwu/HJDFR7U8ubsWBoN0Xp0A==", "dev": true, "dependencies": { - "minimist": "^1.2.0" + "loader-utils": "^2.0.0", + "regex-parser": "^2.2.11" }, - "bin": { - "json5": "lib/cli.js" + "engines": { + "node": ">=8.9" } }, "node_modules/adjust-sourcemap-loader/node_modules/loader-utils": { - "version": "1.2.3", - "resolved": "https://registry.npmjs.org/loader-utils/-/loader-utils-1.2.3.tgz", - "integrity": "sha512-fkpz8ejdnEMG3s37wGL07iSBDg99O9D5yflE9RGNH3hRdx9SOwYfnGYdZOUIZitN8E+E2vkq3MUMYMvPYl5ZZA==", + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/loader-utils/-/loader-utils-2.0.4.tgz", + "integrity": "sha512-xXqpXoINfFhgua9xiqD8fPFHgkoq1mmmpE92WlDbm9rNRd/EbRb+Gqf908T2DMfuHjjJlksiK2RbHVOdD/MqSw==", "dev": true, "dependencies": { "big.js": "^5.2.2", - "emojis-list": "^2.0.0", - "json5": "^1.0.1" + "emojis-list": "^3.0.0", + "json5": "^2.1.2" }, "engines": { - "node": ">=4.0.0" - } - }, - "node_modules/adjust-sourcemap-loader/node_modules/util": { - "version": "0.10.3", - "resolved": "https://registry.npmjs.org/util/-/util-0.10.3.tgz", - "integrity": "sha1-evsa/lCAUkZInj23/g7TeTNqwPk=", - "dev": true, - "dependencies": { - "inherits": "2.0.1" + "node": ">=8.9.0" } }, "node_modules/after": { @@ -1576,12 +1522,6 @@ "sprintf-js": "~1.0.2" } }, - "node_modules/arity-n": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/arity-n/-/arity-n-1.0.4.tgz", - "integrity": "sha1-2edrEXM+CFacCEeuezmyhgswt0U=", - "dev": true - }, "node_modules/arr-diff": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/arr-diff/-/arr-diff-4.0.0.tgz", @@ -3202,15 +3142,6 @@ "integrity": "sha1-ZF/ErfWLcrZJ1crmUTVhnbJv8UM=", "dev": true }, - "node_modules/compose-function": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/compose-function/-/compose-function-3.0.3.tgz", - "integrity": "sha1-ntZ18TzFRQHTCVCkhv9qe6OrGF8=", - "dev": true, - "dependencies": { - "arity-n": "^1.0.4" - } - }, "node_modules/compressible": { "version": "2.0.18", "resolved": "https://registry.npmjs.org/compressible/-/compressible-2.0.18.tgz", @@ -3657,18 +3588,6 @@ "node": "*" } }, - "node_modules/css": { - "version": "2.2.4", - "resolved": "https://registry.npmjs.org/css/-/css-2.2.4.tgz", - "integrity": "sha512-oUnjmWpy0niI3x/mPL8dVEI1l7MnG3+HHyRPHf+YFSbK+svOhXpmSOcDURUh2aOCgl2grzrOPt1nHLuCVFULLw==", - "dev": true, - "dependencies": { - "inherits": "^2.0.3", - "source-map": "^0.6.1", - "source-map-resolve": "^0.5.2", - "urix": "^0.1.0" - } - }, "node_modules/css-color-names": { "version": "0.0.4", "resolved": "https://registry.npmjs.org/css-color-names/-/css-color-names-0.0.4.tgz", @@ -3802,15 +3721,6 @@ "node": ">= 6" } }, - "node_modules/css/node_modules/source-map": { - "version": "0.6.1", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", - "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, "node_modules/cssesc": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/cssesc/-/cssesc-3.0.0.tgz", @@ -3964,16 +3874,6 @@ "integrity": "sha1-WW6WmP0MgOEgOMK4LW6xs1tiJNk=", "dev": true }, - "node_modules/d": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/d/-/d-1.0.1.tgz", - "integrity": "sha512-m62ShEObQ39CfralilEQRjH6oAMtNCV1xJyEx5LpRYUVN+EviphDgUc/F3hnYbADmkiNs67Y+3ylmlG7Lnu+FA==", - "dev": true, - "dependencies": { - "es5-ext": "^0.10.50", - "type": "^1.0.1" - } - }, "node_modules/de-indent": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/de-indent/-/de-indent-1.0.2.tgz", @@ -4672,38 +4572,6 @@ "node": ">= 0.4" } }, - "node_modules/es5-ext": { - "version": "0.10.53", - "resolved": "https://registry.npmjs.org/es5-ext/-/es5-ext-0.10.53.tgz", - "integrity": "sha512-Xs2Stw6NiNHWypzRTY1MtaG/uJlwCk8kH81920ma8mvN8Xq1gsfhZvpkImLQArw8AHnv8MT2I45J3c0R8slE+Q==", - "dev": true, - "dependencies": { - "es6-iterator": "~2.0.3", - "es6-symbol": "~3.1.3", - "next-tick": "~1.0.0" - } - }, - "node_modules/es6-iterator": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/es6-iterator/-/es6-iterator-2.0.3.tgz", - "integrity": "sha1-p96IkUGgWpSwhUQDstCg+/qY87c=", - "dev": true, - "dependencies": { - "d": "1", - "es5-ext": "^0.10.35", - "es6-symbol": "^3.1.1" - } - }, - "node_modules/es6-symbol": { - "version": "3.1.3", - "resolved": "https://registry.npmjs.org/es6-symbol/-/es6-symbol-3.1.3.tgz", - "integrity": "sha512-NJ6Yn3FuDinBaBRWl/q5X/s4koRHBrgKAu+yGI6JCBeiu3qrcbJhwT2GeR/EXVfylRk8dpQVJoLEFhK+Mu31NA==", - "dev": true, - "dependencies": { - "d": "^1.0.1", - "ext": "^1.1.2" - } - }, "node_modules/es6-templates": { "version": "0.2.3", "resolved": "https://registry.npmjs.org/es6-templates/-/es6-templates-0.2.3.tgz", @@ -5007,21 +4875,6 @@ "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=", "dev": true }, - "node_modules/ext": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/ext/-/ext-1.4.0.tgz", - "integrity": "sha512-Key5NIsUxdqKg3vIsdw9dSuXpPCQ297y6wBjL30edxwPgt2E44WcWBZey/ZvUc6sERLTxKdyCu4gZFmUbk1Q7A==", - "dev": true, - "dependencies": { - "type": "^2.0.0" - } - }, - "node_modules/ext/node_modules/type": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/type/-/type-2.1.0.tgz", - "integrity": "sha512-G9absDWvhAWCV2gmF1zKud3OyC61nZDwWvBL2DApaVFogI07CprggiQAOOjvp2NRjYWFzPyu7vwtDrQFq8jeSA==", - "dev": true - }, "node_modules/extend-shallow": { "version": "3.0.2", "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-3.0.2.tgz", @@ -6939,9 +6792,9 @@ } }, "node_modules/loader-utils": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/loader-utils/-/loader-utils-1.4.0.tgz", - "integrity": "sha512-qH0WSMBtn/oHuwjy/NucEgbx5dbxxnxup9s4PVXJUDHZBQY+s0NWA9rJf53RBnQZxfch7euUui7hpoAPvALZdA==", + "version": "1.4.2", + "resolved": "https://registry.npmjs.org/loader-utils/-/loader-utils-1.4.2.tgz", + "integrity": "sha512-I5d00Pd/jwMD2QCduo657+YM/6L3KZu++pmX9VFncxaxvHcru9jx1lBaFft+r4Mt2jK0Yhp41XlRAihzPxHNCg==", "dev": true, "dependencies": { "big.js": "^5.2.2", @@ -7492,6 +7345,18 @@ "dev": true, "optional": true }, + "node_modules/nanoid": { + "version": "3.3.4", + "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.4.tgz", + "integrity": "sha512-MqBkQh/OHTS2egovRtLk45wEyNXwF+cokD+1YPf9u5VfJiRdAiRwB2froX5Co9Rh20xs4siNPm8naNotSD6RBw==", + "dev": true, + "bin": { + "nanoid": "bin/nanoid.cjs" + }, + "engines": { + "node": "^10 || ^12 || ^13.7 || ^14 || >=15.0.1" + } + }, "node_modules/nanomatch": { "version": "1.2.13", "resolved": "https://registry.npmjs.org/nanomatch/-/nanomatch-1.2.13.tgz", @@ -7529,12 +7394,6 @@ "integrity": "sha512-Yd3UES5mWCSqR+qNT93S3UoYUkqAZ9lLg8a7g9rimsWmYGK8cVToA4/sF3RrshdyV3sAGMXVUmpMYOw+dLpOuw==", "dev": true }, - "node_modules/next-tick": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/next-tick/-/next-tick-1.0.0.tgz", - "integrity": "sha1-yobR/ogoFpsBICCOPchCS524NCw=", - "dev": true - }, "node_modules/nice-try": { "version": "1.0.5", "resolved": "https://registry.npmjs.org/nice-try/-/nice-try-1.0.5.tgz", @@ -7750,15 +7609,6 @@ "node": ">= 0.4" } }, - "node_modules/object-path": { - "version": "0.11.4", - "resolved": "https://registry.npmjs.org/object-path/-/object-path-0.11.4.tgz", - "integrity": "sha1-NwrnUvvzfePqcKhhwju6iRVpGUk=", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, "node_modules/object-visit": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/object-visit/-/object-visit-1.0.1.tgz", @@ -9387,9 +9237,9 @@ } }, "node_modules/regex-parser": { - "version": "2.2.10", - "resolved": "https://registry.npmjs.org/regex-parser/-/regex-parser-2.2.10.tgz", - "integrity": "sha512-8t6074A68gHfU8Neftl0Le6KTDwfGAj7IyjPIMSfikI2wJUTHDMaIq42bUsfVnj8mhx0R+45rdUXHGpN164avA==", + "version": "2.2.11", + "resolved": "https://registry.npmjs.org/regex-parser/-/regex-parser-2.2.11.tgz", + "integrity": "sha512-jbD/FT0+9MBU2XAZluI7w2OBs1RBi6p9M83nkoZayQXXU9e8Robt69FcZc7wU4eJD/YFTjn1JdCk3rbMJajz8Q==", "dev": true }, "node_modules/regexp.prototype.flags": { @@ -9599,91 +9449,57 @@ "dev": true }, "node_modules/resolve-url-loader": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/resolve-url-loader/-/resolve-url-loader-3.1.0.tgz", - "integrity": "sha512-2QcrA+2QgVqsMJ1Hn5NnJXIGCX1clQ1F6QJTqOeiaDw9ACo1G2k+8/shq3mtqne03HOFyskAClqfxKyFBriXZg==", - "dev": true, - "dependencies": { - "adjust-sourcemap-loader": "2.0.0", - "camelcase": "5.0.0", - "compose-function": "3.0.3", - "convert-source-map": "1.6.0", - "es6-iterator": "2.0.3", - "loader-utils": "1.2.3", - "postcss": "7.0.14", - "rework": "1.0.1", - "rework-visit": "1.0.0", - "source-map": "0.6.1" - }, - "engines": { - "node": ">=6.0.0" - } - }, - "node_modules/resolve-url-loader/node_modules/camelcase": { "version": "5.0.0", - "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-5.0.0.tgz", - "integrity": "sha512-faqwZqnWxbxn+F1d399ygeamQNy3lPp/H9H6rNrqYh4FSVCtcY+3cub1MxA8o9mDd55mM8Aghuu/kuyYA6VTsA==", - "dev": true, - "engines": { - "node": ">=6" - } - }, - "node_modules/resolve-url-loader/node_modules/convert-source-map": { - "version": "1.6.0", - "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-1.6.0.tgz", - "integrity": "sha512-eFu7XigvxdZ1ETfbgPBohgyQ/Z++C0eEhTor0qRwBw9unw+L0/6V8wkSuGgzdThkiS5lSpdptOQPD8Ak40a+7A==", - "dev": true, - "dependencies": { - "safe-buffer": "~5.1.1" - } - }, - "node_modules/resolve-url-loader/node_modules/emojis-list": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/emojis-list/-/emojis-list-2.1.0.tgz", - "integrity": "sha1-TapNnbAPmBmIDHn6RXrlsJof04k=", - "dev": true, - "engines": { - "node": ">= 0.10" - } - }, - "node_modules/resolve-url-loader/node_modules/json5": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/json5/-/json5-1.0.1.tgz", - "integrity": "sha512-aKS4WQjPenRxiQsC93MNfjx+nbF4PAdYzmd/1JIj8HYzqfbu86beTuNgXDzPknWk0n0uARlyewZo4s++ES36Ow==", + "resolved": "https://registry.npmjs.org/resolve-url-loader/-/resolve-url-loader-5.0.0.tgz", + "integrity": "sha512-uZtduh8/8srhBoMx//5bwqjQ+rfYOUq8zC9NrMUGtjBiGTtFJM42s58/36+hTqeqINcnYe08Nj3LkK9lW4N8Xg==", "dev": true, "dependencies": { - "minimist": "^1.2.0" + "adjust-sourcemap-loader": "^4.0.0", + "convert-source-map": "^1.7.0", + "loader-utils": "^2.0.0", + "postcss": "^8.2.14", + "source-map": "0.6.1" }, - "bin": { - "json5": "lib/cli.js" + "engines": { + "node": ">=12" } }, "node_modules/resolve-url-loader/node_modules/loader-utils": { - "version": "1.2.3", - "resolved": "https://registry.npmjs.org/loader-utils/-/loader-utils-1.2.3.tgz", - "integrity": "sha512-fkpz8ejdnEMG3s37wGL07iSBDg99O9D5yflE9RGNH3hRdx9SOwYfnGYdZOUIZitN8E+E2vkq3MUMYMvPYl5ZZA==", + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/loader-utils/-/loader-utils-2.0.4.tgz", + "integrity": "sha512-xXqpXoINfFhgua9xiqD8fPFHgkoq1mmmpE92WlDbm9rNRd/EbRb+Gqf908T2DMfuHjjJlksiK2RbHVOdD/MqSw==", "dev": true, "dependencies": { "big.js": "^5.2.2", - "emojis-list": "^2.0.0", - "json5": "^1.0.1" + "emojis-list": "^3.0.0", + "json5": "^2.1.2" }, "engines": { - "node": ">=4.0.0" + "node": ">=8.9.0" } }, "node_modules/resolve-url-loader/node_modules/postcss": { - "version": "7.0.14", - "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.14.tgz", - "integrity": "sha512-NsbD6XUUMZvBxtQAJuWDJeeC4QFsmWsfozWxCJPWf3M55K9iu2iMDaKqyoOdTJ1R4usBXuxlVFAIo8rZPQD4Bg==", + "version": "8.4.19", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.4.19.tgz", + "integrity": "sha512-h+pbPsyhlYj6N2ozBmHhHrs9DzGmbaarbLvWipMRO7RLS+v4onj26MPFXA5OBYFxyqYhUJK456SwDcY9H2/zsA==", "dev": true, + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/postcss/" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/postcss" + } + ], "dependencies": { - "chalk": "^2.4.2", - "source-map": "^0.6.1", - "supports-color": "^6.1.0" + "nanoid": "^3.3.4", + "picocolors": "^1.0.0", + "source-map-js": "^1.0.2" }, "engines": { - "node": ">=6.0.0" + "node": "^10 || ^12 || >=14" } }, "node_modules/resolve-url-loader/node_modules/source-map": { @@ -9695,18 +9511,6 @@ "node": ">=0.10.0" } }, - "node_modules/resolve-url-loader/node_modules/supports-color": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-6.1.0.tgz", - "integrity": "sha512-qe1jfm1Mg7Nq/NSh6XE24gPXROEVsWHxC1LIx//XNlD9iw7YZQGjZNjYN7xGaEG6iKdA8EtNFW6R0gjnVXp+wQ==", - "dev": true, - "dependencies": { - "has-flag": "^3.0.0" - }, - "engines": { - "node": ">=6" - } - }, "node_modules/resp-modifier": { "version": "6.0.2", "resolved": "https://registry.npmjs.org/resp-modifier/-/resp-modifier-6.0.2.tgz", @@ -9753,28 +9557,6 @@ "node": ">= 4" } }, - "node_modules/rework": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/rework/-/rework-1.0.1.tgz", - "integrity": "sha1-MIBqhBNCtUUQqkEQhQzUhTQUSqc=", - "dev": true, - "dependencies": { - "convert-source-map": "^0.3.3", - "css": "^2.0.0" - } - }, - "node_modules/rework-visit": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/rework-visit/-/rework-visit-1.0.0.tgz", - "integrity": "sha1-mUWygD8hni96ygCtuLyfZA+ELJo=", - "dev": true - }, - "node_modules/rework/node_modules/convert-source-map": { - "version": "0.3.5", - "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-0.3.5.tgz", - "integrity": "sha1-8dgClQr33SYxof6+BZZVDIarMZA=", - "dev": true - }, "node_modules/rgb-regex": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/rgb-regex/-/rgb-regex-1.0.1.tgz", @@ -10644,6 +10426,15 @@ "node": ">=0.10.0" } }, + "node_modules/source-map-js": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/source-map-js/-/source-map-js-1.0.2.tgz", + "integrity": "sha512-R0XvVJ9WusLiqTCEiGCmICCMplcCkIwwR11mOSD9CR5u+IXYdiseeEuXCVAjS54zqwkLcPNnmU4OeJ6tUrWhDw==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, "node_modules/source-map-resolve": { "version": "0.5.3", "resolved": "https://registry.npmjs.org/source-map-resolve/-/source-map-resolve-0.5.3.tgz", @@ -11397,12 +11188,6 @@ "integrity": "sha1-oVe6QC2iTpv5V/mqadUk7tQpAaY=", "dev": true }, - "node_modules/type": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/type/-/type-1.2.0.tgz", - "integrity": "sha512-+5nt5AAniqsCnu2cEQQdpzCAh33kVx8n0VoFidKpB1dVVLAN/F+bgVOqOJqOnEnrhp222clB5p3vUlD+1QAnfg==", - "dev": true - }, "node_modules/type-is": { "version": "1.6.18", "resolved": "https://registry.npmjs.org/type-is/-/type-is-1.6.18.tgz", @@ -14137,72 +13922,24 @@ "dev": true }, "adjust-sourcemap-loader": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/adjust-sourcemap-loader/-/adjust-sourcemap-loader-2.0.0.tgz", - "integrity": "sha512-4hFsTsn58+YjrU9qKzML2JSSDqKvN8mUGQ0nNIrfPi8hmIONT4L3uUaT6MKdMsZ9AjsU6D2xDkZxCkbQPxChrA==", + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/adjust-sourcemap-loader/-/adjust-sourcemap-loader-4.0.0.tgz", + "integrity": "sha512-OXwN5b9pCUXNQHJpwwD2qP40byEmSgzj8B4ydSN0uMNYWiFmJ6x6KwUllMmfk8Rwu/HJDFR7U8ubsWBoN0Xp0A==", "dev": true, "requires": { - "assert": "1.4.1", - "camelcase": "5.0.0", - "loader-utils": "1.2.3", - "object-path": "0.11.4", - "regex-parser": "2.2.10" + "loader-utils": "^2.0.0", + "regex-parser": "^2.2.11" }, "dependencies": { - "assert": { - "version": "1.4.1", - "resolved": "https://registry.npmjs.org/assert/-/assert-1.4.1.tgz", - "integrity": "sha1-mZEtWRg2tab1s0XA8H7vwI/GXZE=", - "dev": true, - "requires": { - "util": "0.10.3" - } - }, - "camelcase": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-5.0.0.tgz", - "integrity": "sha512-faqwZqnWxbxn+F1d399ygeamQNy3lPp/H9H6rNrqYh4FSVCtcY+3cub1MxA8o9mDd55mM8Aghuu/kuyYA6VTsA==", - "dev": true - }, - "emojis-list": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/emojis-list/-/emojis-list-2.1.0.tgz", - "integrity": "sha1-TapNnbAPmBmIDHn6RXrlsJof04k=", - "dev": true - }, - "inherits": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.1.tgz", - "integrity": "sha1-sX0I0ya0Qj5Wjv9xn5GwscvfafE=", - "dev": true - }, - "json5": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/json5/-/json5-1.0.1.tgz", - "integrity": "sha512-aKS4WQjPenRxiQsC93MNfjx+nbF4PAdYzmd/1JIj8HYzqfbu86beTuNgXDzPknWk0n0uARlyewZo4s++ES36Ow==", - "dev": true, - "requires": { - "minimist": "^1.2.0" - } - }, "loader-utils": { - "version": "1.2.3", - "resolved": "https://registry.npmjs.org/loader-utils/-/loader-utils-1.2.3.tgz", - "integrity": "sha512-fkpz8ejdnEMG3s37wGL07iSBDg99O9D5yflE9RGNH3hRdx9SOwYfnGYdZOUIZitN8E+E2vkq3MUMYMvPYl5ZZA==", + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/loader-utils/-/loader-utils-2.0.4.tgz", + "integrity": "sha512-xXqpXoINfFhgua9xiqD8fPFHgkoq1mmmpE92WlDbm9rNRd/EbRb+Gqf908T2DMfuHjjJlksiK2RbHVOdD/MqSw==", "dev": true, "requires": { "big.js": "^5.2.2", - "emojis-list": "^2.0.0", - "json5": "^1.0.1" - } - }, - "util": { - "version": "0.10.3", - "resolved": "https://registry.npmjs.org/util/-/util-0.10.3.tgz", - "integrity": "sha1-evsa/lCAUkZInj23/g7TeTNqwPk=", - "dev": true, - "requires": { - "inherits": "2.0.1" + "emojis-list": "^3.0.0", + "json5": "^2.1.2" } } } @@ -14316,12 +14053,6 @@ "sprintf-js": "~1.0.2" } }, - "arity-n": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/arity-n/-/arity-n-1.0.4.tgz", - "integrity": "sha1-2edrEXM+CFacCEeuezmyhgswt0U=", - "dev": true - }, "arr-diff": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/arr-diff/-/arr-diff-4.0.0.tgz", @@ -15710,15 +15441,6 @@ "integrity": "sha1-ZF/ErfWLcrZJ1crmUTVhnbJv8UM=", "dev": true }, - "compose-function": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/compose-function/-/compose-function-3.0.3.tgz", - "integrity": "sha1-ntZ18TzFRQHTCVCkhv9qe6OrGF8=", - "dev": true, - "requires": { - "arity-n": "^1.0.4" - } - }, "compressible": { "version": "2.0.18", "resolved": "https://registry.npmjs.org/compressible/-/compressible-2.0.18.tgz", @@ -16091,26 +15813,6 @@ "randomfill": "^1.0.3" } }, - "css": { - "version": "2.2.4", - "resolved": "https://registry.npmjs.org/css/-/css-2.2.4.tgz", - "integrity": "sha512-oUnjmWpy0niI3x/mPL8dVEI1l7MnG3+HHyRPHf+YFSbK+svOhXpmSOcDURUh2aOCgl2grzrOPt1nHLuCVFULLw==", - "dev": true, - "requires": { - "inherits": "^2.0.3", - "source-map": "^0.6.1", - "source-map-resolve": "^0.5.2", - "urix": "^0.1.0" - }, - "dependencies": { - "source-map": { - "version": "0.6.1", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", - "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", - "dev": true - } - } - }, "css-color-names": { "version": "0.0.4", "resolved": "https://registry.npmjs.org/css-color-names/-/css-color-names-0.0.4.tgz", @@ -16346,16 +16048,6 @@ "integrity": "sha1-WW6WmP0MgOEgOMK4LW6xs1tiJNk=", "dev": true }, - "d": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/d/-/d-1.0.1.tgz", - "integrity": "sha512-m62ShEObQ39CfralilEQRjH6oAMtNCV1xJyEx5LpRYUVN+EviphDgUc/F3hnYbADmkiNs67Y+3ylmlG7Lnu+FA==", - "dev": true, - "requires": { - "es5-ext": "^0.10.50", - "type": "^1.0.1" - } - }, "de-indent": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/de-indent/-/de-indent-1.0.2.tgz", @@ -16972,38 +16664,6 @@ "is-symbol": "^1.0.2" } }, - "es5-ext": { - "version": "0.10.53", - "resolved": "https://registry.npmjs.org/es5-ext/-/es5-ext-0.10.53.tgz", - "integrity": "sha512-Xs2Stw6NiNHWypzRTY1MtaG/uJlwCk8kH81920ma8mvN8Xq1gsfhZvpkImLQArw8AHnv8MT2I45J3c0R8slE+Q==", - "dev": true, - "requires": { - "es6-iterator": "~2.0.3", - "es6-symbol": "~3.1.3", - "next-tick": "~1.0.0" - } - }, - "es6-iterator": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/es6-iterator/-/es6-iterator-2.0.3.tgz", - "integrity": "sha1-p96IkUGgWpSwhUQDstCg+/qY87c=", - "dev": true, - "requires": { - "d": "1", - "es5-ext": "^0.10.35", - "es6-symbol": "^3.1.1" - } - }, - "es6-symbol": { - "version": "3.1.3", - "resolved": "https://registry.npmjs.org/es6-symbol/-/es6-symbol-3.1.3.tgz", - "integrity": "sha512-NJ6Yn3FuDinBaBRWl/q5X/s4koRHBrgKAu+yGI6JCBeiu3qrcbJhwT2GeR/EXVfylRk8dpQVJoLEFhK+Mu31NA==", - "dev": true, - "requires": { - "d": "^1.0.1", - "ext": "^1.1.2" - } - }, "es6-templates": { "version": "0.2.3", "resolved": "https://registry.npmjs.org/es6-templates/-/es6-templates-0.2.3.tgz", @@ -17255,23 +16915,6 @@ } } }, - "ext": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/ext/-/ext-1.4.0.tgz", - "integrity": "sha512-Key5NIsUxdqKg3vIsdw9dSuXpPCQ297y6wBjL30edxwPgt2E44WcWBZey/ZvUc6sERLTxKdyCu4gZFmUbk1Q7A==", - "dev": true, - "requires": { - "type": "^2.0.0" - }, - "dependencies": { - "type": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/type/-/type-2.1.0.tgz", - "integrity": "sha512-G9absDWvhAWCV2gmF1zKud3OyC61nZDwWvBL2DApaVFogI07CprggiQAOOjvp2NRjYWFzPyu7vwtDrQFq8jeSA==", - "dev": true - } - } - }, "extend-shallow": { "version": "3.0.2", "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-3.0.2.tgz", @@ -18858,9 +18501,9 @@ "dev": true }, "loader-utils": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/loader-utils/-/loader-utils-1.4.0.tgz", - "integrity": "sha512-qH0WSMBtn/oHuwjy/NucEgbx5dbxxnxup9s4PVXJUDHZBQY+s0NWA9rJf53RBnQZxfch7euUui7hpoAPvALZdA==", + "version": "1.4.2", + "resolved": "https://registry.npmjs.org/loader-utils/-/loader-utils-1.4.2.tgz", + "integrity": "sha512-I5d00Pd/jwMD2QCduo657+YM/6L3KZu++pmX9VFncxaxvHcru9jx1lBaFft+r4Mt2jK0Yhp41XlRAihzPxHNCg==", "dev": true, "requires": { "big.js": "^5.2.2", @@ -19328,6 +18971,12 @@ "dev": true, "optional": true }, + "nanoid": { + "version": "3.3.4", + "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.4.tgz", + "integrity": "sha512-MqBkQh/OHTS2egovRtLk45wEyNXwF+cokD+1YPf9u5VfJiRdAiRwB2froX5Co9Rh20xs4siNPm8naNotSD6RBw==", + "dev": true + }, "nanomatch": { "version": "1.2.13", "resolved": "https://registry.npmjs.org/nanomatch/-/nanomatch-1.2.13.tgz", @@ -19359,12 +19008,6 @@ "integrity": "sha512-Yd3UES5mWCSqR+qNT93S3UoYUkqAZ9lLg8a7g9rimsWmYGK8cVToA4/sF3RrshdyV3sAGMXVUmpMYOw+dLpOuw==", "dev": true }, - "next-tick": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/next-tick/-/next-tick-1.0.0.tgz", - "integrity": "sha1-yobR/ogoFpsBICCOPchCS524NCw=", - "dev": true - }, "nice-try": { "version": "1.0.5", "resolved": "https://registry.npmjs.org/nice-try/-/nice-try-1.0.5.tgz", @@ -19551,12 +19194,6 @@ "integrity": "sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA==", "dev": true }, - "object-path": { - "version": "0.11.4", - "resolved": "https://registry.npmjs.org/object-path/-/object-path-0.11.4.tgz", - "integrity": "sha1-NwrnUvvzfePqcKhhwju6iRVpGUk=", - "dev": true - }, "object-visit": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/object-visit/-/object-visit-1.0.1.tgz", @@ -20961,9 +20598,9 @@ } }, "regex-parser": { - "version": "2.2.10", - "resolved": "https://registry.npmjs.org/regex-parser/-/regex-parser-2.2.10.tgz", - "integrity": "sha512-8t6074A68gHfU8Neftl0Le6KTDwfGAj7IyjPIMSfikI2wJUTHDMaIq42bUsfVnj8mhx0R+45rdUXHGpN164avA==", + "version": "2.2.11", + "resolved": "https://registry.npmjs.org/regex-parser/-/regex-parser-2.2.11.tgz", + "integrity": "sha512-jbD/FT0+9MBU2XAZluI7w2OBs1RBi6p9M83nkoZayQXXU9e8Robt69FcZc7wU4eJD/YFTjn1JdCk3rbMJajz8Q==", "dev": true }, "regexp.prototype.flags": { @@ -21137,73 +20774,38 @@ "dev": true }, "resolve-url-loader": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/resolve-url-loader/-/resolve-url-loader-3.1.0.tgz", - "integrity": "sha512-2QcrA+2QgVqsMJ1Hn5NnJXIGCX1clQ1F6QJTqOeiaDw9ACo1G2k+8/shq3mtqne03HOFyskAClqfxKyFBriXZg==", - "dev": true, - "requires": { - "adjust-sourcemap-loader": "2.0.0", - "camelcase": "5.0.0", - "compose-function": "3.0.3", - "convert-source-map": "1.6.0", - "es6-iterator": "2.0.3", - "loader-utils": "1.2.3", - "postcss": "7.0.14", - "rework": "1.0.1", - "rework-visit": "1.0.0", + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/resolve-url-loader/-/resolve-url-loader-5.0.0.tgz", + "integrity": "sha512-uZtduh8/8srhBoMx//5bwqjQ+rfYOUq8zC9NrMUGtjBiGTtFJM42s58/36+hTqeqINcnYe08Nj3LkK9lW4N8Xg==", + "dev": true, + "requires": { + "adjust-sourcemap-loader": "^4.0.0", + "convert-source-map": "^1.7.0", + "loader-utils": "^2.0.0", + "postcss": "^8.2.14", "source-map": "0.6.1" }, "dependencies": { - "camelcase": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-5.0.0.tgz", - "integrity": "sha512-faqwZqnWxbxn+F1d399ygeamQNy3lPp/H9H6rNrqYh4FSVCtcY+3cub1MxA8o9mDd55mM8Aghuu/kuyYA6VTsA==", - "dev": true - }, - "convert-source-map": { - "version": "1.6.0", - "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-1.6.0.tgz", - "integrity": "sha512-eFu7XigvxdZ1ETfbgPBohgyQ/Z++C0eEhTor0qRwBw9unw+L0/6V8wkSuGgzdThkiS5lSpdptOQPD8Ak40a+7A==", - "dev": true, - "requires": { - "safe-buffer": "~5.1.1" - } - }, - "emojis-list": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/emojis-list/-/emojis-list-2.1.0.tgz", - "integrity": "sha1-TapNnbAPmBmIDHn6RXrlsJof04k=", - "dev": true - }, - "json5": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/json5/-/json5-1.0.1.tgz", - "integrity": "sha512-aKS4WQjPenRxiQsC93MNfjx+nbF4PAdYzmd/1JIj8HYzqfbu86beTuNgXDzPknWk0n0uARlyewZo4s++ES36Ow==", - "dev": true, - "requires": { - "minimist": "^1.2.0" - } - }, "loader-utils": { - "version": "1.2.3", - "resolved": "https://registry.npmjs.org/loader-utils/-/loader-utils-1.2.3.tgz", - "integrity": "sha512-fkpz8ejdnEMG3s37wGL07iSBDg99O9D5yflE9RGNH3hRdx9SOwYfnGYdZOUIZitN8E+E2vkq3MUMYMvPYl5ZZA==", + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/loader-utils/-/loader-utils-2.0.4.tgz", + "integrity": "sha512-xXqpXoINfFhgua9xiqD8fPFHgkoq1mmmpE92WlDbm9rNRd/EbRb+Gqf908T2DMfuHjjJlksiK2RbHVOdD/MqSw==", "dev": true, "requires": { "big.js": "^5.2.2", - "emojis-list": "^2.0.0", - "json5": "^1.0.1" + "emojis-list": "^3.0.0", + "json5": "^2.1.2" } }, "postcss": { - "version": "7.0.14", - "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.14.tgz", - "integrity": "sha512-NsbD6XUUMZvBxtQAJuWDJeeC4QFsmWsfozWxCJPWf3M55K9iu2iMDaKqyoOdTJ1R4usBXuxlVFAIo8rZPQD4Bg==", + "version": "8.4.19", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.4.19.tgz", + "integrity": "sha512-h+pbPsyhlYj6N2ozBmHhHrs9DzGmbaarbLvWipMRO7RLS+v4onj26MPFXA5OBYFxyqYhUJK456SwDcY9H2/zsA==", "dev": true, "requires": { - "chalk": "^2.4.2", - "source-map": "^0.6.1", - "supports-color": "^6.1.0" + "nanoid": "^3.3.4", + "picocolors": "^1.0.0", + "source-map-js": "^1.0.2" } }, "source-map": { @@ -21211,15 +20813,6 @@ "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", "dev": true - }, - "supports-color": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-6.1.0.tgz", - "integrity": "sha512-qe1jfm1Mg7Nq/NSh6XE24gPXROEVsWHxC1LIx//XNlD9iw7YZQGjZNjYN7xGaEG6iKdA8EtNFW6R0gjnVXp+wQ==", - "dev": true, - "requires": { - "has-flag": "^3.0.0" - } } } }, @@ -21262,30 +20855,6 @@ "integrity": "sha1-G0KmJmoh8HQh0bC1S33BZ7AcATs=", "dev": true }, - "rework": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/rework/-/rework-1.0.1.tgz", - "integrity": "sha1-MIBqhBNCtUUQqkEQhQzUhTQUSqc=", - "dev": true, - "requires": { - "convert-source-map": "^0.3.3", - "css": "^2.0.0" - }, - "dependencies": { - "convert-source-map": { - "version": "0.3.5", - "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-0.3.5.tgz", - "integrity": "sha1-8dgClQr33SYxof6+BZZVDIarMZA=", - "dev": true - } - } - }, - "rework-visit": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/rework-visit/-/rework-visit-1.0.0.tgz", - "integrity": "sha1-mUWygD8hni96ygCtuLyfZA+ELJo=", - "dev": true - }, "rgb-regex": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/rgb-regex/-/rgb-regex-1.0.1.tgz", @@ -22079,6 +21648,12 @@ "integrity": "sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w=", "dev": true }, + "source-map-js": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/source-map-js/-/source-map-js-1.0.2.tgz", + "integrity": "sha512-R0XvVJ9WusLiqTCEiGCmICCMplcCkIwwR11mOSD9CR5u+IXYdiseeEuXCVAjS54zqwkLcPNnmU4OeJ6tUrWhDw==", + "dev": true + }, "source-map-resolve": { "version": "0.5.3", "resolved": "https://registry.npmjs.org/source-map-resolve/-/source-map-resolve-0.5.3.tgz", @@ -22705,12 +22280,6 @@ "integrity": "sha1-oVe6QC2iTpv5V/mqadUk7tQpAaY=", "dev": true }, - "type": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/type/-/type-1.2.0.tgz", - "integrity": "sha512-+5nt5AAniqsCnu2cEQQdpzCAh33kVx8n0VoFidKpB1dVVLAN/F+bgVOqOJqOnEnrhp222clB5p3vUlD+1QAnfg==", - "dev": true - }, "type-is": { "version": "1.6.18", "resolved": "https://registry.npmjs.org/type-is/-/type-is-1.6.18.tgz", diff --git a/package.json b/package.json index 320ee697a4..bf35f0c85c 100644 --- a/package.json +++ b/package.json @@ -30,7 +30,7 @@ "browser-sync-webpack-plugin": "^2.0.1", "cross-env": "^7.0.2", "laravel-mix": "^5.0.7", - "resolve-url-loader": "^3.1.0", + "resolve-url-loader": "^5.0.0", "sass": "^1.27.0", "sass-loader": "^8.0.2", "vue-template-compiler": "^2.6.12" From 6995ca8ec96cef8f2e17634e8831fde19cee642f Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Tue, 15 Nov 2022 05:16:48 -0700 Subject: [PATCH 094/280] Bump minimatch from 3.0.4 to 3.1.2 (#4143) Bumps [minimatch](https://github.com/isaacs/minimatch) from 3.0.4 to 3.1.2. - [Release notes](https://github.com/isaacs/minimatch/releases) - [Commits](https://github.com/isaacs/minimatch/compare/v3.0.4...v3.1.2) --- updated-dependencies: - dependency-name: minimatch dependency-type: indirect ... Signed-off-by: dependabot[bot] Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- package-lock.json | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/package-lock.json b/package-lock.json index 714c6343ce..a7f34a0a06 100644 --- a/package-lock.json +++ b/package-lock.json @@ -7182,9 +7182,9 @@ "dev": true }, "node_modules/minimatch": { - "version": "3.0.4", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.0.4.tgz", - "integrity": "sha512-yJHVQEhyqPLUTgt9B83PXu6W3rx4MvvHvSUvToogpwoGDOUQ+yDrR0HRot+yOCdCO7u4hX3pWft6kWBBcqh0UA==", + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", + "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", "dev": true, "dependencies": { "brace-expansion": "^1.1.7" @@ -18835,9 +18835,9 @@ "dev": true }, "minimatch": { - "version": "3.0.4", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.0.4.tgz", - "integrity": "sha512-yJHVQEhyqPLUTgt9B83PXu6W3rx4MvvHvSUvToogpwoGDOUQ+yDrR0HRot+yOCdCO7u4hX3pWft6kWBBcqh0UA==", + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", + "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", "dev": true, "requires": { "brace-expansion": "^1.1.7" From 4cd4395080daec580db96c3317fbea9673515b2b Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Tue, 15 Nov 2022 10:26:33 -0700 Subject: [PATCH 095/280] Bump engine.io and browser-sync (#4151) Bumps [engine.io](https://github.com/socketio/engine.io) to 6.2.0 and updates ancestor dependency [browser-sync](https://github.com/BrowserSync/browser-sync). These dependencies need to be updated together. Updates `engine.io` from 3.2.1 to 6.2.0 - [Release notes](https://github.com/socketio/engine.io/releases) - [Changelog](https://github.com/socketio/engine.io/blob/main/CHANGELOG.md) - [Commits](https://github.com/socketio/engine.io/compare/3.2.1...6.2.0) Updates `browser-sync` from 2.26.13 to 2.27.10 - [Release notes](https://github.com/BrowserSync/browser-sync/releases) - [Changelog](https://github.com/BrowserSync/browser-sync/blob/master/CHANGELOG.md) - [Commits](https://github.com/BrowserSync/browser-sync/compare/v2.26.13...v2.27.10) --- updated-dependencies: - dependency-name: engine.io dependency-type: indirect - dependency-name: browser-sync dependency-type: direct:development ... Signed-off-by: dependabot[bot] Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- package-lock.json | 2091 ++++++++++++++++++++------------------------- package.json | 2 +- 2 files changed, 913 insertions(+), 1180 deletions(-) diff --git a/package-lock.json b/package-lock.json index a7f34a0a06..4e12350243 100644 --- a/package-lock.json +++ b/package-lock.json @@ -16,7 +16,7 @@ "popper.js": "^1.16.1" }, "devDependencies": { - "browser-sync": "^2.26.13", + "browser-sync": "^2.27.10", "browser-sync-webpack-plugin": "^2.0.1", "cross-env": "^7.0.2", "laravel-mix": "^5.0.7", @@ -1077,6 +1077,24 @@ "node": ">= 6" } }, + "node_modules/@socket.io/component-emitter": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/@socket.io/component-emitter/-/component-emitter-3.1.0.tgz", + "integrity": "sha512-+9jVqKhRSpsc591z5vX+X5Yyw+he/HCB4iQ/RYxw35CEPaY1gnsNE43nf9n9AaYjAQrTiI/mOwKUKdUs9vf7Xg==", + "dev": true + }, + "node_modules/@types/cookie": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/@types/cookie/-/cookie-0.4.1.tgz", + "integrity": "sha512-XW/Aa8APYr6jSVVA1y/DEIZX0/GMKLEVekNG727R8cs56ahETkRAy/3DR7+fJyh7oUgGwNQaRfXCun0+KbWY7Q==", + "dev": true + }, + "node_modules/@types/cors": { + "version": "2.8.12", + "resolved": "https://registry.npmjs.org/@types/cors/-/cors-2.8.12.tgz", + "integrity": "sha512-vt+kDhq/M2ayberEtJcIN/hxXy1Pk+59g2FV/ZQceeaTyCtCucjL2Q7FXlFjtWn4n15KCr1NE2lNNFhp0lEThw==", + "dev": true + }, "node_modules/@types/glob": { "version": "7.1.3", "resolved": "https://registry.npmjs.org/@types/glob/-/glob-7.1.3.tgz", @@ -1394,12 +1412,6 @@ "node": ">=8.9.0" } }, - "node_modules/after": { - "version": "0.8.2", - "resolved": "https://registry.npmjs.org/after/-/after-0.8.2.tgz", - "integrity": "sha1-/ts5T58OAqqXaOcCvaI7UF+ufh8=", - "dev": true - }, "node_modules/aggregate-error": { "version": "3.1.0", "resolved": "https://registry.npmjs.org/aggregate-error/-/aggregate-error-3.1.0.tgz", @@ -1585,12 +1597,6 @@ "node": ">=0.10.0" } }, - "node_modules/arraybuffer.slice": { - "version": "0.0.7", - "resolved": "https://registry.npmjs.org/arraybuffer.slice/-/arraybuffer.slice-0.0.7.tgz", - "integrity": "sha512-wGUIVQXuehL5TCqQun8OW81jGzAWycqzFF8lFp+GOM5BXLYj3bKNsYC4daB7n6XjCqxQA/qgTJ+8ANR3acjrog==", - "dev": true - }, "node_modules/arrify": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/arrify/-/arrify-1.0.1.tgz", @@ -1679,7 +1685,7 @@ "node_modules/async-each-series": { "version": "0.1.1", "resolved": "https://registry.npmjs.org/async-each-series/-/async-each-series-0.1.1.tgz", - "integrity": "sha1-dhfBkXQB/Yykooqtzj266Yr+tDI=", + "integrity": "sha512-p4jj6Fws4Iy2m0iCmI2am2ZNZCgbdgE+P8F/8csmn2vx7ixXrO2zGcuNsD46X5uZSVecmkEy/M06X2vG8KD6dQ==", "dev": true, "engines": { "node": ">=0.8.0" @@ -1727,51 +1733,14 @@ "integrity": "sha512-UFw1mPW8NaSECDSTC36HbAOTpF9JK2wBUJcNn4MSvlNtK7SZ9N72gB+ajHtA6D1abYXRcszZnBA4nHBwvFwzHw==" }, "node_modules/axios": { - "version": "0.19.0", - "resolved": "https://registry.npmjs.org/axios/-/axios-0.19.0.tgz", - "integrity": "sha512-1uvKqKQta3KBxIz14F2v06AEHZ/dIoeKfbTRkK1E5oqjDnuEerLmYTgJB5AiQZHJcljpg1TuRzdjDR06qNk0DQ==", - "dev": true, - "dependencies": { - "follow-redirects": "1.5.10", - "is-buffer": "^2.0.2" - } - }, - "node_modules/axios/node_modules/debug": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/debug/-/debug-3.1.0.tgz", - "integrity": "sha512-OX8XqP7/1a9cqkxYw2yXss15f26NKWBpDXQd0/uK/KPqdQhxbPa994hnzjcE2VqQpDslf55723cKPUOGSmMY3g==", - "dev": true, - "dependencies": { - "ms": "2.0.0" - } - }, - "node_modules/axios/node_modules/follow-redirects": { - "version": "1.5.10", - "resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.5.10.tgz", - "integrity": "sha512-0V5l4Cizzvqt5D44aTXbFZz+FtyXV1vrDN6qrelxtfYQKW0KO0W2T/hkE8xvGa/540LkZlkaUjO4ailYTFtHVQ==", + "version": "0.21.4", + "resolved": "https://registry.npmjs.org/axios/-/axios-0.21.4.tgz", + "integrity": "sha512-ut5vewkiu8jjGBdqpM44XxjuCjq9LAKeHVmoVfHVzy8eHgxxq8SbAVQNovDA8mVi05kP0Ea/n/UzcSHcTJQfNg==", "dev": true, "dependencies": { - "debug": "=3.1.0" - }, - "engines": { - "node": ">=4.0" - } - }, - "node_modules/axios/node_modules/is-buffer": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/is-buffer/-/is-buffer-2.0.4.tgz", - "integrity": "sha512-Kq1rokWXOPXWuaMAqZiJW4XxsmD9zGx9q4aePabbn3qCRGedtH7Cm+zV8WETitMfu1wdh+Rvd6w5egwSngUX2A==", - "dev": true, - "engines": { - "node": ">=4" + "follow-redirects": "^1.14.0" } }, - "node_modules/axios/node_modules/ms": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", - "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=", - "dev": true - }, "node_modules/babel-code-frame": { "version": "6.26.0", "resolved": "https://registry.npmjs.org/babel-code-frame/-/babel-code-frame-6.26.0.tgz", @@ -1859,12 +1828,6 @@ "object.assign": "^4.1.0" } }, - "node_modules/backo2": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/backo2/-/backo2-1.0.2.tgz", - "integrity": "sha1-MasayLEpNjRj41s+u2n038+6eUc=", - "dev": true - }, "node_modules/balanced-match": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.0.tgz", @@ -1939,15 +1902,6 @@ "node": ">=0.10.0" } }, - "node_modules/base64-arraybuffer": { - "version": "0.1.4", - "resolved": "https://registry.npmjs.org/base64-arraybuffer/-/base64-arraybuffer-0.1.4.tgz", - "integrity": "sha1-mBjHngWbE1X5fgQooBfIOOkLqBI=", - "dev": true, - "engines": { - "node": ">= 0.6.0" - } - }, "node_modules/base64-js": { "version": "1.3.1", "resolved": "https://registry.npmjs.org/base64-js/-/base64-js-1.3.1.tgz", @@ -1955,12 +1909,12 @@ "dev": true }, "node_modules/base64id": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/base64id/-/base64id-1.0.0.tgz", - "integrity": "sha1-R2iMuZu2gE8OBtPnY7HDLlfY5rY=", + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/base64id/-/base64id-2.0.0.tgz", + "integrity": "sha512-lGe34o6EHj9y3Kts9R4ZYs/Gr+6N7MCaMlIFA3F1R2O5/m7K06AxfSeO5530PEERE6/WyEg3lsuyw4GHlPZHog==", "dev": true, "engines": { - "node": ">= 0.4.0" + "node": "^4.5.0 || >= 5.9" } }, "node_modules/batch": { @@ -1969,18 +1923,6 @@ "integrity": "sha1-3DQxT05nkxgJP8dgJyUl+UvyXBY=", "dev": true }, - "node_modules/better-assert": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/better-assert/-/better-assert-1.0.2.tgz", - "integrity": "sha1-QIZrnhueC1W0gYlDEeaPr/rrxSI=", - "dev": true, - "dependencies": { - "callsite": "1.0.0" - }, - "engines": { - "node": "*" - } - }, "node_modules/big.js": { "version": "5.2.2", "resolved": "https://registry.npmjs.org/big.js/-/big.js-5.2.2.tgz", @@ -2009,12 +1951,6 @@ "file-uri-to-path": "1.0.0" } }, - "node_modules/blob": { - "version": "0.0.5", - "resolved": "https://registry.npmjs.org/blob/-/blob-0.0.5.tgz", - "integrity": "sha512-gaqbzQPqOoamawKg0LGVd7SzLgXS+JH61oWprSLH+P+abTczqJbhTR8CmJ2u9/bUYNmHTGJx/UEmn6doAvvuig==", - "dev": true - }, "node_modules/bluebird": { "version": "3.7.2", "resolved": "https://registry.npmjs.org/bluebird/-/bluebird-3.7.2.tgz", @@ -2161,16 +2097,16 @@ "dev": true }, "node_modules/browser-sync": { - "version": "2.26.13", - "resolved": "https://registry.npmjs.org/browser-sync/-/browser-sync-2.26.13.tgz", - "integrity": "sha512-JPYLTngIzI+Dzx+StSSlMtF+Q9yjdh58HW6bMFqkFXuzQkJL8FCvp4lozlS6BbECZcsM2Gmlgp0uhEjvl18X4w==", + "version": "2.27.10", + "resolved": "https://registry.npmjs.org/browser-sync/-/browser-sync-2.27.10.tgz", + "integrity": "sha512-xKm+6KJmJu6RuMWWbFkKwOCSqQOxYe3nOrFkKI5Tr/ZzjPxyU3pFShKK3tWnazBo/3lYQzN7fzjixG8fwJh1Xw==", "dev": true, "dependencies": { - "browser-sync-client": "^2.26.13", - "browser-sync-ui": "^2.26.13", + "browser-sync-client": "^2.27.10", + "browser-sync-ui": "^2.27.10", "bs-recipes": "1.3.4", "bs-snippet-injector": "^2.0.1", - "chokidar": "^3.4.1", + "chokidar": "^3.5.1", "connect": "3.6.6", "connect-history-api-fallback": "^1", "dev-ip": "^1.0.1", @@ -2181,10 +2117,10 @@ "fs-extra": "3.0.1", "http-proxy": "^1.18.1", "immutable": "^3", - "localtunnel": "^2.0.0", + "localtunnel": "^2.0.1", "micromatch": "^4.0.2", "opn": "5.3.0", - "portscanner": "2.1.1", + "portscanner": "2.2.0", "qs": "6.2.3", "raw-body": "^2.3.2", "resp-modifier": "6.0.2", @@ -2193,9 +2129,9 @@ "serve-index": "1.9.1", "serve-static": "1.13.2", "server-destroy": "1.0.1", - "socket.io": "2.1.1", - "ua-parser-js": "^0.7.18", - "yargs": "^15.4.1" + "socket.io": "^4.4.1", + "ua-parser-js": "1.0.2", + "yargs": "^17.3.1" }, "bin": { "browser-sync": "dist/bin.js" @@ -2205,31 +2141,32 @@ } }, "node_modules/browser-sync-client": { - "version": "2.26.13", - "resolved": "https://registry.npmjs.org/browser-sync-client/-/browser-sync-client-2.26.13.tgz", - "integrity": "sha512-p2VbZoYrpuDhkreq+/Sv1MkToHklh7T1OaIntDwpG6Iy2q/XkBcgwPcWjX+WwRNiZjN8MEehxIjEUh12LweLmQ==", + "version": "2.27.10", + "resolved": "https://registry.npmjs.org/browser-sync-client/-/browser-sync-client-2.27.10.tgz", + "integrity": "sha512-KCFKA1YDj6cNul0VsA28apohtBsdk5Wv8T82ClOZPZMZWxPj4Ny5AUbrj9UlAb/k6pdxE5HABrWDhP9+cjt4HQ==", "dev": true, "dependencies": { "etag": "1.8.1", "fresh": "0.5.2", "mitt": "^1.1.3", - "rxjs": "^5.5.6" + "rxjs": "^5.5.6", + "typescript": "^4.6.2" }, "engines": { "node": ">=8.0.0" } }, "node_modules/browser-sync-ui": { - "version": "2.26.13", - "resolved": "https://registry.npmjs.org/browser-sync-ui/-/browser-sync-ui-2.26.13.tgz", - "integrity": "sha512-6NJ/pCnhCnBMzaty1opWo7ipDmFAIk8U71JMQGKJxblCUaGfdsbF2shf6XNZSkXYia1yS0vwKu9LIOzpXqQZCA==", + "version": "2.27.10", + "resolved": "https://registry.npmjs.org/browser-sync-ui/-/browser-sync-ui-2.27.10.tgz", + "integrity": "sha512-elbJILq4Uo6OQv6gsvS3Y9vRAJlWu+h8j0JDkF0X/ua+3S6SVbbiWnZc8sNOFlG7yvVGIwBED3eaYQ0iBo1Dtw==", "dev": true, "dependencies": { "async-each-series": "0.1.1", "connect-history-api-fallback": "^1", "immutable": "^3", "server-destroy": "1.0.1", - "socket.io-client": "^2.0.4", + "socket.io-client": "^4.4.1", "stream-throttle": "^0.1.3" } }, @@ -2242,10 +2179,34 @@ "lodash": "^4" } }, + "node_modules/browser-sync/node_modules/ansi-regex": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", + "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/browser-sync/node_modules/ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "dev": true, + "dependencies": { + "color-convert": "^2.0.1" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, "node_modules/browser-sync/node_modules/anymatch": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-3.1.1.tgz", - "integrity": "sha512-mM8522psRCqzV+6LhomX5wgp25YVibjh8Wj23I5RPkPppSVSjyKD2A2mBJmWGa+KN7f2D6LNh9jkBCeyLktzjg==", + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-3.1.2.tgz", + "integrity": "sha512-P43ePfOAIupkguHUycrc4qJ9kz8ZiuOUijaETwX7THt0Y/GNK7v0aa8rY816xWjZ7rJdA5XdMcpVFTKMq+RvWg==", "dev": true, "dependencies": { "normalize-path": "^3.0.0", @@ -2256,9 +2217,9 @@ } }, "node_modules/browser-sync/node_modules/binary-extensions": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-2.1.0.tgz", - "integrity": "sha512-1Yj8h9Q+QDF5FzhMs/c9+6UntbD5MkRfRwac8DoEm9ZfUBZ7tZ55YcGVAzEe4bXsdQHEk+s9S5wsOKVdZrw0tQ==", + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-2.2.0.tgz", + "integrity": "sha512-jDctJ/IVQbZoJykoeHbhXpOlNBqGNcwXJKJog42E5HDPUwQTSdjCHdihjj0DlnheQ7blbT6dHOafNAiS8ooQKA==", "dev": true, "engines": { "node": ">=8" @@ -2277,26 +2238,64 @@ } }, "node_modules/browser-sync/node_modules/chokidar": { - "version": "3.4.3", - "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.4.3.tgz", - "integrity": "sha512-DtM3g7juCXQxFVSNPNByEC2+NImtBuxQQvWlHunpJIS5Ocr0lG306cC7FCi7cEA0fzmybPUIl4txBIobk1gGOQ==", + "version": "3.5.3", + "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.5.3.tgz", + "integrity": "sha512-Dr3sfKRP6oTcjf2JmUmFJfeVMvXBdegxB0iVQ5eb2V10uFJUCAS8OByZdVAyVb8xXNz3GjjTgj9kLWsZTqE6kw==", "dev": true, + "funding": [ + { + "type": "individual", + "url": "https://paulmillr.com/funding/" + } + ], "dependencies": { - "anymatch": "~3.1.1", + "anymatch": "~3.1.2", "braces": "~3.0.2", - "glob-parent": "~5.1.0", + "glob-parent": "~5.1.2", "is-binary-path": "~2.1.0", "is-glob": "~4.0.1", "normalize-path": "~3.0.0", - "readdirp": "~3.5.0" + "readdirp": "~3.6.0" }, "engines": { "node": ">= 8.10.0" }, "optionalDependencies": { - "fsevents": "~2.1.2" + "fsevents": "~2.3.2" + } + }, + "node_modules/browser-sync/node_modules/cliui": { + "version": "8.0.1", + "resolved": "https://registry.npmjs.org/cliui/-/cliui-8.0.1.tgz", + "integrity": "sha512-BSeNnyus75C4//NQ9gQt1/csTXyo/8Sb+afLAkzAptFuMsod9HFokGNudZpi/oQV73hnVK+sR+5PVRMd+Dr7YQ==", + "dev": true, + "dependencies": { + "string-width": "^4.2.0", + "strip-ansi": "^6.0.1", + "wrap-ansi": "^7.0.0" + }, + "engines": { + "node": ">=12" } }, + "node_modules/browser-sync/node_modules/color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "dev": true, + "dependencies": { + "color-name": "~1.1.4" + }, + "engines": { + "node": ">=7.0.0" + } + }, + "node_modules/browser-sync/node_modules/color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", + "dev": true + }, "node_modules/browser-sync/node_modules/debug": { "version": "2.6.9", "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", @@ -2306,6 +2305,12 @@ "ms": "2.0.0" } }, + "node_modules/browser-sync/node_modules/emoji-regex": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", + "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==", + "dev": true + }, "node_modules/browser-sync/node_modules/fill-range": { "version": "7.0.1", "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.0.1.tgz", @@ -2330,10 +2335,11 @@ } }, "node_modules/browser-sync/node_modules/fsevents": { - "version": "2.1.3", - "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.1.3.tgz", - "integrity": "sha512-Auw9a4AxqWpa9GUfj370BMPzzyncfBABW8Mab7BGWBYDj4Isgq+cDKtx0i6u9jcX9pQDnswsaaOTgTmA5pEjuQ==", + "version": "2.3.2", + "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.2.tgz", + "integrity": "sha512-xiqMQR4xAeHTuB9uWm+fFRcIOgKBMiOBP+eXiyT7jsgVCq1bkVygt00oASowB7EdtpOHaaPgKt812P9ab+DDKA==", "dev": true, + "hasInstallScript": true, "optional": true, "os": [ "darwin" @@ -2343,9 +2349,9 @@ } }, "node_modules/browser-sync/node_modules/glob-parent": { - "version": "5.1.1", - "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.1.tgz", - "integrity": "sha512-FnI+VGOpnlGHWZxthPGR+QhR78fuiK0sNLkHQv+bL9fQi57lNNdquIbna/WrfROrolq8GK5Ek6BiMwqL/voRYQ==", + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz", + "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==", "dev": true, "dependencies": { "is-glob": "^4.0.1" @@ -2387,6 +2393,15 @@ "node": ">=8" } }, + "node_modules/browser-sync/node_modules/is-fullwidth-code-point": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", + "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==", + "dev": true, + "engines": { + "node": ">=8" + } + }, "node_modules/browser-sync/node_modules/is-number": { "version": "7.0.0", "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz", @@ -2455,9 +2470,9 @@ } }, "node_modules/browser-sync/node_modules/readdirp": { - "version": "3.5.0", - "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-3.5.0.tgz", - "integrity": "sha512-cMhu7c/8rdhkHXWsY+osBhfSy0JikwpHK/5+imo+LpeasTF8ouErHrlYkwT0++njiyuDvc7OFY5T3ukvZ8qmFQ==", + "version": "3.6.0", + "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-3.6.0.tgz", + "integrity": "sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA==", "dev": true, "dependencies": { "picomatch": "^2.2.1" @@ -2520,6 +2535,32 @@ "node": ">= 0.6" } }, + "node_modules/browser-sync/node_modules/string-width": { + "version": "4.2.3", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", + "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", + "dev": true, + "dependencies": { + "emoji-regex": "^8.0.0", + "is-fullwidth-code-point": "^3.0.0", + "strip-ansi": "^6.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/browser-sync/node_modules/strip-ansi": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", + "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", + "dev": true, + "dependencies": { + "ansi-regex": "^5.0.1" + }, + "engines": { + "node": ">=8" + } + }, "node_modules/browser-sync/node_modules/to-regex-range": { "version": "5.0.1", "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz", @@ -2532,6 +2573,59 @@ "node": ">=8.0" } }, + "node_modules/browser-sync/node_modules/wrap-ansi": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz", + "integrity": "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==", + "dev": true, + "dependencies": { + "ansi-styles": "^4.0.0", + "string-width": "^4.1.0", + "strip-ansi": "^6.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/wrap-ansi?sponsor=1" + } + }, + "node_modules/browser-sync/node_modules/y18n": { + "version": "5.0.8", + "resolved": "https://registry.npmjs.org/y18n/-/y18n-5.0.8.tgz", + "integrity": "sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA==", + "dev": true, + "engines": { + "node": ">=10" + } + }, + "node_modules/browser-sync/node_modules/yargs": { + "version": "17.6.2", + "resolved": "https://registry.npmjs.org/yargs/-/yargs-17.6.2.tgz", + "integrity": "sha512-1/9UrdHjDZc0eOU0HxOHoS78C69UD3JRMvzlJ7S79S2nTaWRA/whGCTV8o9e/N/1Va9YIV7Q4sOxD8VV4pCWOw==", + "dev": true, + "dependencies": { + "cliui": "^8.0.1", + "escalade": "^3.1.1", + "get-caller-file": "^2.0.5", + "require-directory": "^2.1.1", + "string-width": "^4.2.3", + "y18n": "^5.0.5", + "yargs-parser": "^21.1.1" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/browser-sync/node_modules/yargs-parser": { + "version": "21.1.1", + "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-21.1.1.tgz", + "integrity": "sha512-tVpsJW7DdjecAiFpbIB1e3qxIQsE6NoPc5/eTdrbbIC4h0LVsWhnoa3g+m2HclBIujHzsxZ4VJVA+GUuc2/LBw==", + "dev": true, + "engines": { + "node": ">=12" + } + }, "node_modules/browserify-aes": { "version": "1.2.0", "resolved": "https://registry.npmjs.org/browserify-aes/-/browserify-aes-1.2.0.tgz", @@ -2789,15 +2883,6 @@ "node": ">=4" } }, - "node_modules/callsite": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/callsite/-/callsite-1.0.0.tgz", - "integrity": "sha1-KAOY5dZkvXQDi28JBRU+borxvCA=", - "dev": true, - "engines": { - "node": "*" - } - }, "node_modules/callsites": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/callsites/-/callsites-2.0.0.tgz", @@ -3124,24 +3209,12 @@ "integrity": "sha1-3dgA2gxmEnOTzKWVDqloo6rxJTs=", "dev": true }, - "node_modules/component-bind": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/component-bind/-/component-bind-1.0.0.tgz", - "integrity": "sha1-AMYIq33Nk4l8AAllGx06jh5zu9E=", - "dev": true - }, "node_modules/component-emitter": { "version": "1.3.0", "resolved": "https://registry.npmjs.org/component-emitter/-/component-emitter-1.3.0.tgz", "integrity": "sha512-Rd3se6QB+sO1TwqZjscQrurpEPIfO0/yYnSin6Q/rD3mOutHvUrCAhJub3r90uNb+SESBuE0QYoB90YdfatsRg==", "dev": true }, - "node_modules/component-inherit": { - "version": "0.0.3", - "resolved": "https://registry.npmjs.org/component-inherit/-/component-inherit-0.0.3.tgz", - "integrity": "sha1-ZF/ErfWLcrZJ1crmUTVhnbJv8UM=", - "dev": true - }, "node_modules/compressible": { "version": "2.0.18", "resolved": "https://registry.npmjs.org/compressible/-/compressible-2.0.18.tgz", @@ -3406,6 +3479,19 @@ "integrity": "sha1-tf1UIgqivFq1eqtxQMlAdUUDwac=", "dev": true }, + "node_modules/cors": { + "version": "2.8.5", + "resolved": "https://registry.npmjs.org/cors/-/cors-2.8.5.tgz", + "integrity": "sha512-KIHbLJqu73RGr/hnbrO9uBeixNGuvSQjul/jdFvS/KFSIH1hWVd1ng7zOHx+YrEfInLG7q4n6GHQ9cDtxv/P6g==", + "dev": true, + "dependencies": { + "object-assign": "^4", + "vary": "^1" + }, + "engines": { + "node": ">= 0.10" + } + }, "node_modules/cosmiconfig": { "version": "5.2.1", "resolved": "https://registry.npmjs.org/cosmiconfig/-/cosmiconfig-5.2.1.tgz", @@ -3881,15 +3967,20 @@ "dev": true }, "node_modules/debug": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.2.0.tgz", - "integrity": "sha512-IX2ncY78vDTjZMFUdmsvIRFY2Cf4FnD0wRs+nQwJU8Lu99/tPFdb0VybiiMTPe3I6rQmwsqQqRBvxU+bZ/I8sg==", + "version": "4.3.2", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.2.tgz", + "integrity": "sha512-mOp8wKcvj7XxC78zLgw/ZA+6TSgkoE2C/ienthhRD298T7UNwAg9diBpLRxC0mOezLl4B0xV7M0cCO6P/O0Xhw==", "dev": true, "dependencies": { "ms": "2.1.2" }, "engines": { "node": ">=6.0" + }, + "peerDependenciesMeta": { + "supports-color": { + "optional": true + } } }, "node_modules/decamelize": { @@ -4346,130 +4437,97 @@ } }, "node_modules/engine.io": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/engine.io/-/engine.io-3.2.1.tgz", - "integrity": "sha512-+VlKzHzMhaU+GsCIg4AoXF1UdDFjHHwMmMKqMJNDNLlUlejz58FCy4LBqB2YVJskHGYl06BatYWKP2TVdVXE5w==", + "version": "6.2.0", + "resolved": "https://registry.npmjs.org/engine.io/-/engine.io-6.2.0.tgz", + "integrity": "sha512-4KzwW3F3bk+KlzSOY57fj/Jx6LyRQ1nbcyIadehl+AnXjKT7gDO0ORdRi/84ixvMKTym6ZKuxvbzN62HDDU1Lg==", "dev": true, "dependencies": { + "@types/cookie": "^0.4.1", + "@types/cors": "^2.8.12", + "@types/node": ">=10.0.0", "accepts": "~1.3.4", - "base64id": "1.0.0", - "cookie": "0.3.1", - "debug": "~3.1.0", - "engine.io-parser": "~2.1.0", - "ws": "~3.3.1" + "base64id": "2.0.0", + "cookie": "~0.4.1", + "cors": "~2.8.5", + "debug": "~4.3.1", + "engine.io-parser": "~5.0.3", + "ws": "~8.2.3" + }, + "engines": { + "node": ">=10.0.0" } }, "node_modules/engine.io-client": { - "version": "3.4.4", - "resolved": "https://registry.npmjs.org/engine.io-client/-/engine.io-client-3.4.4.tgz", - "integrity": "sha512-iU4CRr38Fecj8HoZEnFtm2EiKGbYZcPn3cHxqNGl/tmdWRf60KhK+9vE0JeSjgnlS/0oynEfLgKbT9ALpim0sQ==", - "dev": true, - "dependencies": { - "component-emitter": "~1.3.0", - "component-inherit": "0.0.3", - "debug": "~3.1.0", - "engine.io-parser": "~2.2.0", - "has-cors": "1.1.0", - "indexof": "0.0.1", - "parseqs": "0.0.6", - "parseuri": "0.0.6", - "ws": "~6.1.0", - "xmlhttprequest-ssl": "~1.5.4", - "yeast": "0.1.2" - } - }, - "node_modules/engine.io-client/node_modules/debug": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/debug/-/debug-3.1.0.tgz", - "integrity": "sha512-OX8XqP7/1a9cqkxYw2yXss15f26NKWBpDXQd0/uK/KPqdQhxbPa994hnzjcE2VqQpDslf55723cKPUOGSmMY3g==", + "version": "6.2.3", + "resolved": "https://registry.npmjs.org/engine.io-client/-/engine.io-client-6.2.3.tgz", + "integrity": "sha512-aXPtgF1JS3RuuKcpSrBtimSjYvrbhKW9froICH4s0F3XQWLxsKNxqzG39nnvQZQnva4CMvUK63T7shevxRyYHw==", "dev": true, "dependencies": { - "ms": "2.0.0" + "@socket.io/component-emitter": "~3.1.0", + "debug": "~4.3.1", + "engine.io-parser": "~5.0.3", + "ws": "~8.2.3", + "xmlhttprequest-ssl": "~2.0.0" } }, - "node_modules/engine.io-client/node_modules/ms": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", - "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=", - "dev": true - }, "node_modules/engine.io-client/node_modules/ws": { - "version": "6.1.4", - "resolved": "https://registry.npmjs.org/ws/-/ws-6.1.4.tgz", - "integrity": "sha512-eqZfL+NE/YQc1/ZynhojeV8q+H050oR8AZ2uIev7RU10svA9ZnJUddHcOUZTJLinZ9yEfdA2kSATS2qZK5fhJA==", + "version": "8.2.3", + "resolved": "https://registry.npmjs.org/ws/-/ws-8.2.3.tgz", + "integrity": "sha512-wBuoj1BDpC6ZQ1B7DWQBYVLphPWkm8i9Y0/3YdHjHKHiohOJ1ws+3OccDWtH+PoC9DZD5WOTrJvNbWvjS6JWaA==", "dev": true, - "dependencies": { - "async-limiter": "~1.0.0" + "engines": { + "node": ">=10.0.0" + }, + "peerDependencies": { + "bufferutil": "^4.0.1", + "utf-8-validate": "^5.0.2" + }, + "peerDependenciesMeta": { + "bufferutil": { + "optional": true + }, + "utf-8-validate": { + "optional": true + } } }, "node_modules/engine.io-parser": { - "version": "2.2.1", - "resolved": "https://registry.npmjs.org/engine.io-parser/-/engine.io-parser-2.2.1.tgz", - "integrity": "sha512-x+dN/fBH8Ro8TFwJ+rkB2AmuVw9Yu2mockR/p3W8f8YtExwFgDvBDi0GWyb4ZLkpahtDGZgtr3zLovanJghPqg==", - "dev": true, - "dependencies": { - "after": "0.8.2", - "arraybuffer.slice": "~0.0.7", - "base64-arraybuffer": "0.1.4", - "blob": "0.0.5", - "has-binary2": "~1.0.2" - } - }, - "node_modules/engine.io/node_modules/base64-arraybuffer": { - "version": "0.1.5", - "resolved": "https://registry.npmjs.org/base64-arraybuffer/-/base64-arraybuffer-0.1.5.tgz", - "integrity": "sha1-c5JncZI7Whl0etZmqlzUv5xunOg=", + "version": "5.0.4", + "resolved": "https://registry.npmjs.org/engine.io-parser/-/engine.io-parser-5.0.4.tgz", + "integrity": "sha512-+nVFp+5z1E3HcToEnO7ZIj3g+3k9389DvWtvJZz0T6/eOCPIyyxehFcedoYrZQrp0LgQbD9pPXhpMBKMd5QURg==", "dev": true, "engines": { - "node": ">= 0.6.0" + "node": ">=10.0.0" } }, "node_modules/engine.io/node_modules/cookie": { - "version": "0.3.1", - "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.3.1.tgz", - "integrity": "sha1-5+Ch+e9DtMi6klxcWpboBtFoc7s=", + "version": "0.4.2", + "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.4.2.tgz", + "integrity": "sha512-aSWTXFzaKWkvHO1Ny/s+ePFpvKsPnjc551iI41v3ny/ow6tBG5Vd+FuqGNhh1LxOmVzOlGUriIlOaokOvhaStA==", "dev": true, "engines": { "node": ">= 0.6" } }, - "node_modules/engine.io/node_modules/debug": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/debug/-/debug-3.1.0.tgz", - "integrity": "sha512-OX8XqP7/1a9cqkxYw2yXss15f26NKWBpDXQd0/uK/KPqdQhxbPa994hnzjcE2VqQpDslf55723cKPUOGSmMY3g==", - "dev": true, - "dependencies": { - "ms": "2.0.0" - } - }, - "node_modules/engine.io/node_modules/engine.io-parser": { - "version": "2.1.3", - "resolved": "https://registry.npmjs.org/engine.io-parser/-/engine.io-parser-2.1.3.tgz", - "integrity": "sha512-6HXPre2O4Houl7c4g7Ic/XzPnHBvaEmN90vtRO9uLmwtRqQmTOw0QMevL1TOfL2Cpu1VzsaTmMotQgMdkzGkVA==", - "dev": true, - "dependencies": { - "after": "0.8.2", - "arraybuffer.slice": "~0.0.7", - "base64-arraybuffer": "0.1.5", - "blob": "0.0.5", - "has-binary2": "~1.0.2" - } - }, - "node_modules/engine.io/node_modules/ms": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", - "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=", - "dev": true - }, "node_modules/engine.io/node_modules/ws": { - "version": "3.3.3", - "resolved": "https://registry.npmjs.org/ws/-/ws-3.3.3.tgz", - "integrity": "sha512-nnWLa/NwZSt4KQJu51MYlCcSQ5g7INpOrOMt4XV8j4dqTXdmlUmSHQ8/oLC069ckre0fRsgfvsKwbTdtKLCDkA==", + "version": "8.2.3", + "resolved": "https://registry.npmjs.org/ws/-/ws-8.2.3.tgz", + "integrity": "sha512-wBuoj1BDpC6ZQ1B7DWQBYVLphPWkm8i9Y0/3YdHjHKHiohOJ1ws+3OccDWtH+PoC9DZD5WOTrJvNbWvjS6JWaA==", "dev": true, - "dependencies": { - "async-limiter": "~1.0.0", - "safe-buffer": "~5.1.0", - "ultron": "~1.1.0" + "engines": { + "node": ">=10.0.0" + }, + "peerDependencies": { + "bufferutil": "^4.0.1", + "utf-8-validate": "^5.0.2" + }, + "peerDependenciesMeta": { + "bufferutil": { + "optional": true + }, + "utf-8-validate": { + "optional": true + } } }, "node_modules/enhanced-resolve": { @@ -5223,12 +5281,23 @@ } }, "node_modules/follow-redirects": { - "version": "1.13.0", - "resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.13.0.tgz", - "integrity": "sha512-aq6gF1BEKje4a9i9+5jimNFIpq4Q1WiwBToeRK5NvZBd/TRsmW8BsJfOEGkr76TbOyPVD3OVDN910EcUNtRYEA==", + "version": "1.15.2", + "resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.15.2.tgz", + "integrity": "sha512-VQLG33o04KaQ8uYi2tVNbdrWp1QWxNNea+nmIB4EVM28v0hmP17z7aG1+wAkNzVq4KeXTq3221ye5qTJP91JwA==", "dev": true, + "funding": [ + { + "type": "individual", + "url": "https://github.com/sponsors/RubenVerborgh" + } + ], "engines": { "node": ">=4.0" + }, + "peerDependenciesMeta": { + "debug": { + "optional": true + } } }, "node_modules/for-in": { @@ -5597,27 +5666,6 @@ "node": ">=0.10.0" } }, - "node_modules/has-binary2": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/has-binary2/-/has-binary2-1.0.3.tgz", - "integrity": "sha512-G1LWKhDSvhGeAQ8mPVQlqNcOB2sJdwATtZKl2pDKKHfpf/rYj24lkinxf69blJbnsvtqqNU+L3SL50vzZhXOnw==", - "dev": true, - "dependencies": { - "isarray": "2.0.1" - } - }, - "node_modules/has-binary2/node_modules/isarray": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/isarray/-/isarray-2.0.1.tgz", - "integrity": "sha1-o32U7ZzaLVmGXJ92/llu4fM4dB4=", - "dev": true - }, - "node_modules/has-cors": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/has-cors/-/has-cors-1.1.0.tgz", - "integrity": "sha1-XkdHk/fqmEPRu5nCPu9J/xJv/zk=", - "dev": true - }, "node_modules/has-flag": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", @@ -6020,7 +6068,7 @@ "node_modules/immutable": { "version": "3.8.2", "resolved": "https://registry.npmjs.org/immutable/-/immutable-3.8.2.tgz", - "integrity": "sha1-wkOZUUVbs5kT2vKBN28VMOEErfM=", + "integrity": "sha512-15gZoQ38eYjEjxkorfbcgBKBL6R7T459OuK+CpcWt7O3KF4uPCx2tD0uFETlUDIyo+1789crbMhTvQBSR5yBMg==", "dev": true, "engines": { "node": ">=0.10.0" @@ -6108,12 +6156,6 @@ "integrity": "sha1-8w9xbI4r00bHtn0985FVZqfAVgc=", "dev": true }, - "node_modules/indexof": { - "version": "0.0.1", - "resolved": "https://registry.npmjs.org/indexof/-/indexof-0.0.1.tgz", - "integrity": "sha1-gtwzbSMrkGIXnQWrMpOmYFn9Q10=", - "dev": true - }, "node_modules/infer-owner": { "version": "1.0.4", "resolved": "https://registry.npmjs.org/infer-owner/-/infer-owner-1.0.4.tgz", @@ -6818,15 +6860,15 @@ } }, "node_modules/localtunnel": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/localtunnel/-/localtunnel-2.0.0.tgz", - "integrity": "sha512-g6E0aLgYYDvQDxIjIXkgJo2+pHj3sGg4Wz/XP3h2KtZnRsWPbOQY+hw1H8Z91jep998fkcVE9l+kghO+97vllg==", + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/localtunnel/-/localtunnel-2.0.2.tgz", + "integrity": "sha512-n418Cn5ynvJd7m/N1d9WVJISLJF/ellZnfsLnx8WBWGzxv/ntNcFkJ1o6se5quUhCplfLGBNL5tYHiq5WF3Nug==", "dev": true, "dependencies": { - "axios": "0.19.0", - "debug": "4.1.1", + "axios": "0.21.4", + "debug": "4.3.2", "openurl": "1.1.1", - "yargs": "13.3.0" + "yargs": "17.1.1" }, "bin": { "lt": "bin/lt.js" @@ -6836,65 +6878,150 @@ } }, "node_modules/localtunnel/node_modules/ansi-regex": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-4.1.0.tgz", - "integrity": "sha512-1apePfXM1UOSqw0o9IiFAovVz9M5S1Dg+4TrDwfMewQ6p/rmMueb7tWZjQ1rx4Loy1ArBggoqGpfqqdI4rondg==", + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", + "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", "dev": true, "engines": { - "node": ">=6" + "node": ">=8" } }, - "node_modules/localtunnel/node_modules/debug": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.1.1.tgz", - "integrity": "sha512-pYAIzeRo8J6KPEaJ0VWOh5Pzkbw/RetuzehGM7QRRX5he4fPHx2rdKMB256ehJCkX+XRQm16eZLqLNS8RSZXZw==", + "node_modules/localtunnel/node_modules/ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", "dev": true, "dependencies": { - "ms": "^2.1.1" + "color-convert": "^2.0.1" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/localtunnel/node_modules/cliui": { + "version": "7.0.4", + "resolved": "https://registry.npmjs.org/cliui/-/cliui-7.0.4.tgz", + "integrity": "sha512-OcRE68cOsVMXp1Yvonl/fzkQOyjLSu/8bhPDfQt0e0/Eb283TKP20Fs2MqoPsr9SwA595rRCA+QMzYc9nBP+JQ==", + "dev": true, + "dependencies": { + "string-width": "^4.2.0", + "strip-ansi": "^6.0.0", + "wrap-ansi": "^7.0.0" + } + }, + "node_modules/localtunnel/node_modules/color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "dev": true, + "dependencies": { + "color-name": "~1.1.4" + }, + "engines": { + "node": ">=7.0.0" + } + }, + "node_modules/localtunnel/node_modules/color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", + "dev": true + }, + "node_modules/localtunnel/node_modules/emoji-regex": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", + "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==", + "dev": true + }, + "node_modules/localtunnel/node_modules/is-fullwidth-code-point": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", + "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==", + "dev": true, + "engines": { + "node": ">=8" } }, "node_modules/localtunnel/node_modules/string-width": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-3.1.0.tgz", - "integrity": "sha512-vafcv6KjVZKSgz06oM/H6GDBrAtz8vdhQakGjFIvNrHA6y3HCF1CInLy+QLq8dTJPQ1b+KDUqDFctkdRW44e1w==", + "version": "4.2.3", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", + "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", "dev": true, "dependencies": { - "emoji-regex": "^7.0.1", - "is-fullwidth-code-point": "^2.0.0", - "strip-ansi": "^5.1.0" + "emoji-regex": "^8.0.0", + "is-fullwidth-code-point": "^3.0.0", + "strip-ansi": "^6.0.1" }, "engines": { - "node": ">=6" + "node": ">=8" } }, "node_modules/localtunnel/node_modules/strip-ansi": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-5.2.0.tgz", - "integrity": "sha512-DuRs1gKbBqsMKIZlrffwlug8MHkcnpjs5VPmL1PAh+mA30U0DTotfDZ0d2UUsXpPmPmMMJ6W773MaA3J+lbiWA==", + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", + "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", "dev": true, "dependencies": { - "ansi-regex": "^4.1.0" + "ansi-regex": "^5.0.1" }, "engines": { - "node": ">=6" + "node": ">=8" + } + }, + "node_modules/localtunnel/node_modules/wrap-ansi": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz", + "integrity": "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==", + "dev": true, + "dependencies": { + "ansi-styles": "^4.0.0", + "string-width": "^4.1.0", + "strip-ansi": "^6.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/wrap-ansi?sponsor=1" + } + }, + "node_modules/localtunnel/node_modules/y18n": { + "version": "5.0.8", + "resolved": "https://registry.npmjs.org/y18n/-/y18n-5.0.8.tgz", + "integrity": "sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA==", + "dev": true, + "engines": { + "node": ">=10" } }, "node_modules/localtunnel/node_modules/yargs": { - "version": "13.3.0", - "resolved": "https://registry.npmjs.org/yargs/-/yargs-13.3.0.tgz", - "integrity": "sha512-2eehun/8ALW8TLoIl7MVaRUrg+yCnenu8B4kBlRxj3GJGDKU1Og7sMXPNm1BYyM1DOJmTZ4YeN/Nwxv+8XJsUA==", + "version": "17.1.1", + "resolved": "https://registry.npmjs.org/yargs/-/yargs-17.1.1.tgz", + "integrity": "sha512-c2k48R0PwKIqKhPMWjeiF6y2xY/gPMUlro0sgxqXpbOIohWiLNXWslsootttv7E1e73QPAMQSg5FeySbVcpsPQ==", "dev": true, "dependencies": { - "cliui": "^5.0.0", - "find-up": "^3.0.0", - "get-caller-file": "^2.0.1", + "cliui": "^7.0.2", + "escalade": "^3.1.1", + "get-caller-file": "^2.0.5", "require-directory": "^2.1.1", - "require-main-filename": "^2.0.0", - "set-blocking": "^2.0.0", - "string-width": "^3.0.0", - "which-module": "^2.0.0", - "y18n": "^4.0.0", - "yargs-parser": "^13.1.1" + "string-width": "^4.2.0", + "y18n": "^5.0.5", + "yargs-parser": "^20.2.2" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/localtunnel/node_modules/yargs-parser": { + "version": "20.2.9", + "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-20.2.9.tgz", + "integrity": "sha512-y11nGElTIV+CT3Zv9t7VKl+Q3hTQoT9a1Qzezhhl6Rp21gJ/IVTW7Z3y9EWXhuUBC2Shnf+DX0antecpAwSP8w==", + "dev": true, + "engines": { + "node": ">=10" } }, "node_modules/locate-path": { @@ -6919,7 +7046,7 @@ "node_modules/lodash.isfinite": { "version": "3.3.2", "resolved": "https://registry.npmjs.org/lodash.isfinite/-/lodash.isfinite-3.3.2.tgz", - "integrity": "sha1-+4m2WpqAKBgz8LdHizpRBPiY67M=", + "integrity": "sha512-7FGG40uhC8Mm633uKW1r58aElFlBlxCrg9JfSi3P6aYiWmfiWF0PgMd86ZUsxE5GwWPdHoS2+48bwTh2VPkIQA==", "dev": true }, "node_modules/lodash.memoize": { @@ -7537,12 +7664,6 @@ "node": ">=0.10.0" } }, - "node_modules/object-component": { - "version": "0.0.3", - "resolved": "https://registry.npmjs.org/object-component/-/object-component-0.0.3.tgz", - "integrity": "sha1-8MaapQ78lbhmwYb0AKM3acsvEpE=", - "dev": true - }, "node_modules/object-copy": { "version": "0.1.0", "resolved": "https://registry.npmjs.org/object-copy/-/object-copy-0.1.0.tgz", @@ -7771,7 +7892,7 @@ "node_modules/openurl": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/openurl/-/openurl-1.1.1.tgz", - "integrity": "sha1-OHW0sO96UsFW8NtB1GCduw+Us4c=", + "integrity": "sha512-d/gTkTb1i1GKz5k3XE3XFV/PxQ1k45zDqGP2OA7YhgsaLoqm6qRvARAZOFer1fcXritWlGBRCu/UgeS4HAnXAA==", "dev": true }, "node_modules/opn": { @@ -7947,18 +8068,6 @@ "node": ">=0.10.0" } }, - "node_modules/parseqs": { - "version": "0.0.6", - "resolved": "https://registry.npmjs.org/parseqs/-/parseqs-0.0.6.tgz", - "integrity": "sha512-jeAGzMDbfSHHA091hr0r31eYfTig+29g3GKKE/PPbEQ65X0lmMwlEoqmhzu0iztID5uJpZsFlUPDP8ThPL7M8w==", - "dev": true - }, - "node_modules/parseuri": { - "version": "0.0.6", - "resolved": "https://registry.npmjs.org/parseuri/-/parseuri-0.0.6.tgz", - "integrity": "sha512-AUjen8sAkGgao7UyCX6Ahv0gIK2fABKmYjvP4xmy5JaKvcbTRueIqIPHLAfq30xJddqSE033IOMUSOMCcK3Sow==", - "dev": true - }, "node_modules/parseurl": { "version": "1.3.3", "resolved": "https://registry.npmjs.org/parseurl/-/parseurl-1.3.3.tgz", @@ -8157,12 +8266,12 @@ } }, "node_modules/portscanner": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/portscanner/-/portscanner-2.1.1.tgz", - "integrity": "sha1-6rtAnk3iSVD1oqUW01rnaTQ/u5Y=", + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/portscanner/-/portscanner-2.2.0.tgz", + "integrity": "sha512-IFroCz/59Lqa2uBvzK3bKDbDDIEaAY8XJ1jFxcLWTqosrsc32//P4VuSB2vZXoHiHqOmx8B5L5hnKOxL/7FlPw==", "dev": true, "dependencies": { - "async": "1.5.2", + "async": "^2.6.0", "is-number-like": "^1.0.3" }, "engines": { @@ -8170,12 +8279,6 @@ "npm": ">=1.0.0" } }, - "node_modules/portscanner/node_modules/async": { - "version": "1.5.2", - "resolved": "https://registry.npmjs.org/async/-/async-1.5.2.tgz", - "integrity": "sha1-7GphrlZIDAw8skHJVhjiCJL5Zyo=", - "dev": true - }, "node_modules/posix-character-classes": { "version": "0.1.1", "resolved": "https://registry.npmjs.org/posix-character-classes/-/posix-character-classes-0.1.1.tgz", @@ -9855,7 +9958,7 @@ "node_modules/server-destroy": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/server-destroy/-/server-destroy-1.0.1.tgz", - "integrity": "sha1-8Tv5KOQrnD55OD5hzDmYtdFObN0=", + "integrity": "sha512-rb+9B5YBIEzYcD6x2VKidaa+cqYBJQKnU4oe4E3ANwRRN56yk/ua1YCJT1n21NTS8w6CcOclAKNP3PhdCXKYtQ==", "dev": true }, "node_modules/set-blocking": { @@ -10128,241 +10231,76 @@ "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", "dev": true, "dependencies": { - "is-extendable": "^0.1.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/snapdragon/node_modules/is-extendable": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-0.1.1.tgz", - "integrity": "sha1-YrEQ4omkcUGOPsNqYX1HLjAd/Ik=", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/snapdragon/node_modules/ms": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", - "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=", - "dev": true - }, - "node_modules/socket.io": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/socket.io/-/socket.io-2.1.1.tgz", - "integrity": "sha512-rORqq9c+7W0DAK3cleWNSyfv/qKXV99hV4tZe+gGLfBECw3XEhBy7x85F3wypA9688LKjtwO9pX9L33/xQI8yA==", - "dev": true, - "dependencies": { - "debug": "~3.1.0", - "engine.io": "~3.2.0", - "has-binary2": "~1.0.2", - "socket.io-adapter": "~1.1.0", - "socket.io-client": "2.1.1", - "socket.io-parser": "~3.2.0" - } - }, - "node_modules/socket.io-adapter": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/socket.io-adapter/-/socket.io-adapter-1.1.2.tgz", - "integrity": "sha512-WzZRUj1kUjrTIrUKpZLEzFZ1OLj5FwLlAFQs9kuZJzJi5DKdU7FsWc36SNmA8iDOtwBQyT8FkrriRM8vXLYz8g==", - "dev": true - }, - "node_modules/socket.io-client": { - "version": "2.3.1", - "resolved": "https://registry.npmjs.org/socket.io-client/-/socket.io-client-2.3.1.tgz", - "integrity": "sha512-YXmXn3pA8abPOY//JtYxou95Ihvzmg8U6kQyolArkIyLd0pgVhrfor/iMsox8cn07WCOOvvuJ6XKegzIucPutQ==", - "dev": true, - "dependencies": { - "backo2": "1.0.2", - "component-bind": "1.0.0", - "component-emitter": "~1.3.0", - "debug": "~3.1.0", - "engine.io-client": "~3.4.0", - "has-binary2": "~1.0.2", - "indexof": "0.0.1", - "parseqs": "0.0.6", - "parseuri": "0.0.6", - "socket.io-parser": "~3.3.0", - "to-array": "0.1.4" - } - }, - "node_modules/socket.io-client/node_modules/debug": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/debug/-/debug-3.1.0.tgz", - "integrity": "sha512-OX8XqP7/1a9cqkxYw2yXss15f26NKWBpDXQd0/uK/KPqdQhxbPa994hnzjcE2VqQpDslf55723cKPUOGSmMY3g==", - "dev": true, - "dependencies": { - "ms": "2.0.0" - } - }, - "node_modules/socket.io-client/node_modules/ms": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", - "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=", - "dev": true - }, - "node_modules/socket.io-parser": { - "version": "3.3.1", - "resolved": "https://registry.npmjs.org/socket.io-parser/-/socket.io-parser-3.3.1.tgz", - "integrity": "sha512-1QLvVAe8dTz+mKmZ07Swxt+LAo4Y1ff50rlyoEx00TQmDFVQYPfcqGvIDJLGaBdhdNCecXtyKpD+EgKGcmmbuQ==", - "dev": true, - "dependencies": { - "component-emitter": "~1.3.0", - "debug": "~3.1.0", - "isarray": "2.0.1" - } - }, - "node_modules/socket.io-parser/node_modules/debug": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/debug/-/debug-3.1.0.tgz", - "integrity": "sha512-OX8XqP7/1a9cqkxYw2yXss15f26NKWBpDXQd0/uK/KPqdQhxbPa994hnzjcE2VqQpDslf55723cKPUOGSmMY3g==", - "dev": true, - "dependencies": { - "ms": "2.0.0" - } - }, - "node_modules/socket.io-parser/node_modules/isarray": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/isarray/-/isarray-2.0.1.tgz", - "integrity": "sha1-o32U7ZzaLVmGXJ92/llu4fM4dB4=", - "dev": true - }, - "node_modules/socket.io-parser/node_modules/ms": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", - "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=", - "dev": true - }, - "node_modules/socket.io/node_modules/base64-arraybuffer": { - "version": "0.1.5", - "resolved": "https://registry.npmjs.org/base64-arraybuffer/-/base64-arraybuffer-0.1.5.tgz", - "integrity": "sha1-c5JncZI7Whl0etZmqlzUv5xunOg=", - "dev": true, - "engines": { - "node": ">= 0.6.0" - } - }, - "node_modules/socket.io/node_modules/component-emitter": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/component-emitter/-/component-emitter-1.2.1.tgz", - "integrity": "sha1-E3kY1teCg/ffemt8WmPhQOaUJeY=", - "dev": true - }, - "node_modules/socket.io/node_modules/debug": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/debug/-/debug-3.1.0.tgz", - "integrity": "sha512-OX8XqP7/1a9cqkxYw2yXss15f26NKWBpDXQd0/uK/KPqdQhxbPa994hnzjcE2VqQpDslf55723cKPUOGSmMY3g==", - "dev": true, - "dependencies": { - "ms": "2.0.0" - } - }, - "node_modules/socket.io/node_modules/engine.io-client": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/engine.io-client/-/engine.io-client-3.2.1.tgz", - "integrity": "sha512-y5AbkytWeM4jQr7m/koQLc5AxpRKC1hEVUb/s1FUAWEJq5AzJJ4NLvzuKPuxtDi5Mq755WuDvZ6Iv2rXj4PTzw==", - "dev": true, - "dependencies": { - "component-emitter": "1.2.1", - "component-inherit": "0.0.3", - "debug": "~3.1.0", - "engine.io-parser": "~2.1.1", - "has-cors": "1.1.0", - "indexof": "0.0.1", - "parseqs": "0.0.5", - "parseuri": "0.0.5", - "ws": "~3.3.1", - "xmlhttprequest-ssl": "~1.5.4", - "yeast": "0.1.2" - } - }, - "node_modules/socket.io/node_modules/engine.io-parser": { - "version": "2.1.3", - "resolved": "https://registry.npmjs.org/engine.io-parser/-/engine.io-parser-2.1.3.tgz", - "integrity": "sha512-6HXPre2O4Houl7c4g7Ic/XzPnHBvaEmN90vtRO9uLmwtRqQmTOw0QMevL1TOfL2Cpu1VzsaTmMotQgMdkzGkVA==", - "dev": true, - "dependencies": { - "after": "0.8.2", - "arraybuffer.slice": "~0.0.7", - "base64-arraybuffer": "0.1.5", - "blob": "0.0.5", - "has-binary2": "~1.0.2" + "is-extendable": "^0.1.0" + }, + "engines": { + "node": ">=0.10.0" } }, - "node_modules/socket.io/node_modules/isarray": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/isarray/-/isarray-2.0.1.tgz", - "integrity": "sha1-o32U7ZzaLVmGXJ92/llu4fM4dB4=", - "dev": true + "node_modules/snapdragon/node_modules/is-extendable": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-0.1.1.tgz", + "integrity": "sha1-YrEQ4omkcUGOPsNqYX1HLjAd/Ik=", + "dev": true, + "engines": { + "node": ">=0.10.0" + } }, - "node_modules/socket.io/node_modules/ms": { + "node_modules/snapdragon/node_modules/ms": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=", "dev": true }, - "node_modules/socket.io/node_modules/parseqs": { - "version": "0.0.5", - "resolved": "https://registry.npmjs.org/parseqs/-/parseqs-0.0.5.tgz", - "integrity": "sha1-1SCKNzjkZ2bikbouoXNoSSGouJ0=", + "node_modules/socket.io": { + "version": "4.5.3", + "resolved": "https://registry.npmjs.org/socket.io/-/socket.io-4.5.3.tgz", + "integrity": "sha512-zdpnnKU+H6mOp7nYRXH4GNv1ux6HL6+lHL8g7Ds7Lj8CkdK1jJK/dlwsKDculbyOHifcJ0Pr/yeXnZQ5GeFrcg==", "dev": true, "dependencies": { - "better-assert": "~1.0.0" + "accepts": "~1.3.4", + "base64id": "~2.0.0", + "debug": "~4.3.2", + "engine.io": "~6.2.0", + "socket.io-adapter": "~2.4.0", + "socket.io-parser": "~4.2.0" + }, + "engines": { + "node": ">=10.0.0" } }, - "node_modules/socket.io/node_modules/parseuri": { - "version": "0.0.5", - "resolved": "https://registry.npmjs.org/parseuri/-/parseuri-0.0.5.tgz", - "integrity": "sha1-gCBKUNTbt3m/3G6+J3jZDkvOMgo=", - "dev": true, - "dependencies": { - "better-assert": "~1.0.0" - } + "node_modules/socket.io-adapter": { + "version": "2.4.0", + "resolved": "https://registry.npmjs.org/socket.io-adapter/-/socket.io-adapter-2.4.0.tgz", + "integrity": "sha512-W4N+o69rkMEGVuk2D/cvca3uYsvGlMwsySWV447y99gUPghxq42BxqLNMndb+a1mm/5/7NeXVQS7RLa2XyXvYg==", + "dev": true }, - "node_modules/socket.io/node_modules/socket.io-client": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/socket.io-client/-/socket.io-client-2.1.1.tgz", - "integrity": "sha512-jxnFyhAuFxYfjqIgduQlhzqTcOEQSn+OHKVfAxWaNWa7ecP7xSNk2Dx/3UEsDcY7NcFafxvNvKPmmO7HTwTxGQ==", - "dev": true, - "dependencies": { - "backo2": "1.0.2", - "base64-arraybuffer": "0.1.5", - "component-bind": "1.0.0", - "component-emitter": "1.2.1", - "debug": "~3.1.0", - "engine.io-client": "~3.2.0", - "has-binary2": "~1.0.2", - "has-cors": "1.1.0", - "indexof": "0.0.1", - "object-component": "0.0.3", - "parseqs": "0.0.5", - "parseuri": "0.0.5", - "socket.io-parser": "~3.2.0", - "to-array": "0.1.4" - } - }, - "node_modules/socket.io/node_modules/socket.io-parser": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/socket.io-parser/-/socket.io-parser-3.2.0.tgz", - "integrity": "sha512-FYiBx7rc/KORMJlgsXysflWx/RIvtqZbyGLlHZvjfmPTPeuD/I8MaW7cfFrj5tRltICJdgwflhfZ3NVVbVLFQA==", + "node_modules/socket.io-client": { + "version": "4.5.3", + "resolved": "https://registry.npmjs.org/socket.io-client/-/socket.io-client-4.5.3.tgz", + "integrity": "sha512-I/hqDYpQ6JKwtJOf5ikM+Qz+YujZPMEl6qBLhxiP0nX+TfXKhW4KZZG8lamrD6Y5ngjmYHreESVasVCgi5Kl3A==", "dev": true, "dependencies": { - "component-emitter": "1.2.1", - "debug": "~3.1.0", - "isarray": "2.0.1" + "@socket.io/component-emitter": "~3.1.0", + "debug": "~4.3.2", + "engine.io-client": "~6.2.3", + "socket.io-parser": "~4.2.0" + }, + "engines": { + "node": ">=10.0.0" } }, - "node_modules/socket.io/node_modules/ws": { - "version": "3.3.3", - "resolved": "https://registry.npmjs.org/ws/-/ws-3.3.3.tgz", - "integrity": "sha512-nnWLa/NwZSt4KQJu51MYlCcSQ5g7INpOrOMt4XV8j4dqTXdmlUmSHQ8/oLC069ckre0fRsgfvsKwbTdtKLCDkA==", + "node_modules/socket.io-parser": { + "version": "4.2.1", + "resolved": "https://registry.npmjs.org/socket.io-parser/-/socket.io-parser-4.2.1.tgz", + "integrity": "sha512-V4GrkLy+HeF1F/en3SpUaM+7XxYXpuMUWLGde1kSSh5nQMN4hLrbPIkD+otwh6q9R6NOQBN4AMaOZ2zVjui82g==", "dev": true, "dependencies": { - "async-limiter": "~1.0.0", - "safe-buffer": "~5.1.0", - "ultron": "~1.1.0" + "@socket.io/component-emitter": "~3.1.0", + "debug": "~4.3.1" + }, + "engines": { + "node": ">=10.0.0" } }, "node_modules/sockjs": { @@ -10636,7 +10574,7 @@ "node_modules/stream-throttle": { "version": "0.1.3", "resolved": "https://registry.npmjs.org/stream-throttle/-/stream-throttle-0.1.3.tgz", - "integrity": "sha1-rdV8jXzHOoFjDTHNVdOWHPr7qcM=", + "integrity": "sha512-889+B9vN9dq7/vLbGyuHeZ6/ctf5sNuGWsDy89uNxkFTAgzy0eK7+w5fL3KLNRTkLle7EgZGvHUphZW0Q26MnQ==", "dev": true, "dependencies": { "commander": "^2.2.0", @@ -10830,7 +10768,7 @@ "node_modules/symbol-observable": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/symbol-observable/-/symbol-observable-1.0.1.tgz", - "integrity": "sha1-g0D8RwLDEi310iKI+IKD9RPT/dQ=", + "integrity": "sha512-Kb3PrPYz4HanVF1LVGuAdW6LoVgIwjUYJGzFe7NDrBLCN4lsV/5J0MFurV+ygS4bRVwrCEt2c7MQ1R2a72oJDw==", "dev": true, "engines": { "node": ">=0.10.0" @@ -11094,12 +11032,6 @@ "integrity": "sha1-QFQRqOfmM5/mTbmiNN4R3DHgK9Q=", "dev": true }, - "node_modules/to-array": { - "version": "0.1.4", - "resolved": "https://registry.npmjs.org/to-array/-/to-array-0.1.4.tgz", - "integrity": "sha1-F+bBH3PdTz10zaek/zI46a2b+JA=", - "dev": true - }, "node_modules/to-arraybuffer": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/to-arraybuffer/-/to-arraybuffer-1.0.1.tgz", @@ -11207,10 +11139,23 @@ "integrity": "sha1-hnrHTjhkGHsdPUfZlqeOxciDB3c=", "dev": true }, + "node_modules/typescript": { + "version": "4.8.4", + "resolved": "https://registry.npmjs.org/typescript/-/typescript-4.8.4.tgz", + "integrity": "sha512-QCh+85mCy+h0IGff8r5XWzOVSbBO+KfeYrMQh7NJ58QujwcE22u+NUSmUxqF+un70P9GXKxa2HCNiTTMJknyjQ==", + "dev": true, + "bin": { + "tsc": "bin/tsc", + "tsserver": "bin/tsserver" + }, + "engines": { + "node": ">=4.2.0" + } + }, "node_modules/ua-parser-js": { - "version": "0.7.31", - "resolved": "https://registry.npmjs.org/ua-parser-js/-/ua-parser-js-0.7.31.tgz", - "integrity": "sha512-qLK/Xe9E2uzmYI3qLeOmI0tEOt+TBBQyUIAh4aAgU05FVYzeZrKUdkAZfBNVGRaHVgV0TDkdEngJSw/SyQchkQ==", + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/ua-parser-js/-/ua-parser-js-1.0.2.tgz", + "integrity": "sha512-00y/AXhx0/SsnI51fTc0rLRmafiGOM4/O+ny10Ps7f+j/b8p/ZY11ytMgznXkOVo4GQ+KwQG5UQLkLGirsACRg==", "dev": true, "funding": [ { @@ -11257,12 +11202,6 @@ "node": ">=0.10.0" } }, - "node_modules/ultron": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/ultron/-/ultron-1.1.1.tgz", - "integrity": "sha512-UIEXBNeYmKptWH6z8ZnqTeS8fV74zG0/eRU9VGkpzz+LIJNs8W/zM/L+7ctCkRrgbNnnR0xxw4bKOr0cW0N0Og==", - "dev": true - }, "node_modules/unicode-canonical-property-names-ecmascript": { "version": "1.0.4", "resolved": "https://registry.npmjs.org/unicode-canonical-property-names-ecmascript/-/unicode-canonical-property-names-ecmascript-1.0.4.tgz", @@ -12377,9 +12316,9 @@ } }, "node_modules/xmlhttprequest-ssl": { - "version": "1.5.5", - "resolved": "https://registry.npmjs.org/xmlhttprequest-ssl/-/xmlhttprequest-ssl-1.5.5.tgz", - "integrity": "sha1-wodrBhaKrcQOV9l+gRkayPQ5iz4=", + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/xmlhttprequest-ssl/-/xmlhttprequest-ssl-2.0.0.tgz", + "integrity": "sha512-QKxVRxiRACQcVuQEYFsI1hhkrMlrXHPegbbd1yn9UHOmRxY+si12nQYzri3vbzt8VdTTRviqcKxcyllFas5z2A==", "dev": true, "engines": { "node": ">=0.4.0" @@ -12601,12 +12540,6 @@ "engines": { "node": ">=6" } - }, - "node_modules/yeast": { - "version": "0.1.2", - "resolved": "https://registry.npmjs.org/yeast/-/yeast-0.1.2.tgz", - "integrity": "sha1-AI4G2AlDIMNy28L47XagymyKxBk=", - "dev": true } }, "dependencies": { @@ -13643,6 +13576,24 @@ "integrity": "sha512-shAmDyaQC4H92APFoIaVDHCx5bStIocgvbwQyxPRrbUY20V1EYTbSDchWbuwlMG3V17cprZhA6+78JfB+3DTPw==", "dev": true }, + "@socket.io/component-emitter": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/@socket.io/component-emitter/-/component-emitter-3.1.0.tgz", + "integrity": "sha512-+9jVqKhRSpsc591z5vX+X5Yyw+he/HCB4iQ/RYxw35CEPaY1gnsNE43nf9n9AaYjAQrTiI/mOwKUKdUs9vf7Xg==", + "dev": true + }, + "@types/cookie": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/@types/cookie/-/cookie-0.4.1.tgz", + "integrity": "sha512-XW/Aa8APYr6jSVVA1y/DEIZX0/GMKLEVekNG727R8cs56ahETkRAy/3DR7+fJyh7oUgGwNQaRfXCun0+KbWY7Q==", + "dev": true + }, + "@types/cors": { + "version": "2.8.12", + "resolved": "https://registry.npmjs.org/@types/cors/-/cors-2.8.12.tgz", + "integrity": "sha512-vt+kDhq/M2ayberEtJcIN/hxXy1Pk+59g2FV/ZQceeaTyCtCucjL2Q7FXlFjtWn4n15KCr1NE2lNNFhp0lEThw==", + "dev": true + }, "@types/glob": { "version": "7.1.3", "resolved": "https://registry.npmjs.org/@types/glob/-/glob-7.1.3.tgz", @@ -13944,12 +13895,6 @@ } } }, - "after": { - "version": "0.8.2", - "resolved": "https://registry.npmjs.org/after/-/after-0.8.2.tgz", - "integrity": "sha1-/ts5T58OAqqXaOcCvaI7UF+ufh8=", - "dev": true - }, "aggregate-error": { "version": "3.1.0", "resolved": "https://registry.npmjs.org/aggregate-error/-/aggregate-error-3.1.0.tgz", @@ -14098,12 +14043,6 @@ "integrity": "sha1-qJS3XUvE9s1nnvMkSp/Y9Gri1Cg=", "dev": true }, - "arraybuffer.slice": { - "version": "0.0.7", - "resolved": "https://registry.npmjs.org/arraybuffer.slice/-/arraybuffer.slice-0.0.7.tgz", - "integrity": "sha512-wGUIVQXuehL5TCqQun8OW81jGzAWycqzFF8lFp+GOM5BXLYj3bKNsYC4daB7n6XjCqxQA/qgTJ+8ANR3acjrog==", - "dev": true - }, "arrify": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/arrify/-/arrify-1.0.1.tgz", @@ -14187,7 +14126,7 @@ "async-each-series": { "version": "0.1.1", "resolved": "https://registry.npmjs.org/async-each-series/-/async-each-series-0.1.1.tgz", - "integrity": "sha1-dhfBkXQB/Yykooqtzj266Yr+tDI=", + "integrity": "sha512-p4jj6Fws4Iy2m0iCmI2am2ZNZCgbdgE+P8F/8csmn2vx7ixXrO2zGcuNsD46X5uZSVecmkEy/M06X2vG8KD6dQ==", "dev": true }, "async-limiter": { @@ -14223,45 +14162,12 @@ "integrity": "sha512-UFw1mPW8NaSECDSTC36HbAOTpF9JK2wBUJcNn4MSvlNtK7SZ9N72gB+ajHtA6D1abYXRcszZnBA4nHBwvFwzHw==" }, "axios": { - "version": "0.19.0", - "resolved": "https://registry.npmjs.org/axios/-/axios-0.19.0.tgz", - "integrity": "sha512-1uvKqKQta3KBxIz14F2v06AEHZ/dIoeKfbTRkK1E5oqjDnuEerLmYTgJB5AiQZHJcljpg1TuRzdjDR06qNk0DQ==", + "version": "0.21.4", + "resolved": "https://registry.npmjs.org/axios/-/axios-0.21.4.tgz", + "integrity": "sha512-ut5vewkiu8jjGBdqpM44XxjuCjq9LAKeHVmoVfHVzy8eHgxxq8SbAVQNovDA8mVi05kP0Ea/n/UzcSHcTJQfNg==", "dev": true, "requires": { - "follow-redirects": "1.5.10", - "is-buffer": "^2.0.2" - }, - "dependencies": { - "debug": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/debug/-/debug-3.1.0.tgz", - "integrity": "sha512-OX8XqP7/1a9cqkxYw2yXss15f26NKWBpDXQd0/uK/KPqdQhxbPa994hnzjcE2VqQpDslf55723cKPUOGSmMY3g==", - "dev": true, - "requires": { - "ms": "2.0.0" - } - }, - "follow-redirects": { - "version": "1.5.10", - "resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.5.10.tgz", - "integrity": "sha512-0V5l4Cizzvqt5D44aTXbFZz+FtyXV1vrDN6qrelxtfYQKW0KO0W2T/hkE8xvGa/540LkZlkaUjO4ailYTFtHVQ==", - "dev": true, - "requires": { - "debug": "=3.1.0" - } - }, - "is-buffer": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/is-buffer/-/is-buffer-2.0.4.tgz", - "integrity": "sha512-Kq1rokWXOPXWuaMAqZiJW4XxsmD9zGx9q4aePabbn3qCRGedtH7Cm+zV8WETitMfu1wdh+Rvd6w5egwSngUX2A==", - "dev": true - }, - "ms": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", - "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=", - "dev": true - } + "follow-redirects": "^1.14.0" } }, "babel-code-frame": { @@ -14341,12 +14247,6 @@ "object.assign": "^4.1.0" } }, - "backo2": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/backo2/-/backo2-1.0.2.tgz", - "integrity": "sha1-MasayLEpNjRj41s+u2n038+6eUc=", - "dev": true - }, "balanced-match": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.0.tgz", @@ -14408,12 +14308,6 @@ } } }, - "base64-arraybuffer": { - "version": "0.1.4", - "resolved": "https://registry.npmjs.org/base64-arraybuffer/-/base64-arraybuffer-0.1.4.tgz", - "integrity": "sha1-mBjHngWbE1X5fgQooBfIOOkLqBI=", - "dev": true - }, "base64-js": { "version": "1.3.1", "resolved": "https://registry.npmjs.org/base64-js/-/base64-js-1.3.1.tgz", @@ -14421,9 +14315,9 @@ "dev": true }, "base64id": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/base64id/-/base64id-1.0.0.tgz", - "integrity": "sha1-R2iMuZu2gE8OBtPnY7HDLlfY5rY=", + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/base64id/-/base64id-2.0.0.tgz", + "integrity": "sha512-lGe34o6EHj9y3Kts9R4ZYs/Gr+6N7MCaMlIFA3F1R2O5/m7K06AxfSeO5530PEERE6/WyEg3lsuyw4GHlPZHog==", "dev": true }, "batch": { @@ -14432,15 +14326,6 @@ "integrity": "sha1-3DQxT05nkxgJP8dgJyUl+UvyXBY=", "dev": true }, - "better-assert": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/better-assert/-/better-assert-1.0.2.tgz", - "integrity": "sha1-QIZrnhueC1W0gYlDEeaPr/rrxSI=", - "dev": true, - "requires": { - "callsite": "1.0.0" - } - }, "big.js": { "version": "5.2.2", "resolved": "https://registry.npmjs.org/big.js/-/big.js-5.2.2.tgz", @@ -14463,12 +14348,6 @@ "file-uri-to-path": "1.0.0" } }, - "blob": { - "version": "0.0.5", - "resolved": "https://registry.npmjs.org/blob/-/blob-0.0.5.tgz", - "integrity": "sha512-gaqbzQPqOoamawKg0LGVd7SzLgXS+JH61oWprSLH+P+abTczqJbhTR8CmJ2u9/bUYNmHTGJx/UEmn6doAvvuig==", - "dev": true - }, "bluebird": { "version": "3.7.2", "resolved": "https://registry.npmjs.org/bluebird/-/bluebird-3.7.2.tgz", @@ -14604,16 +14483,16 @@ "dev": true }, "browser-sync": { - "version": "2.26.13", - "resolved": "https://registry.npmjs.org/browser-sync/-/browser-sync-2.26.13.tgz", - "integrity": "sha512-JPYLTngIzI+Dzx+StSSlMtF+Q9yjdh58HW6bMFqkFXuzQkJL8FCvp4lozlS6BbECZcsM2Gmlgp0uhEjvl18X4w==", + "version": "2.27.10", + "resolved": "https://registry.npmjs.org/browser-sync/-/browser-sync-2.27.10.tgz", + "integrity": "sha512-xKm+6KJmJu6RuMWWbFkKwOCSqQOxYe3nOrFkKI5Tr/ZzjPxyU3pFShKK3tWnazBo/3lYQzN7fzjixG8fwJh1Xw==", "dev": true, "requires": { - "browser-sync-client": "^2.26.13", - "browser-sync-ui": "^2.26.13", + "browser-sync-client": "^2.27.10", + "browser-sync-ui": "^2.27.10", "bs-recipes": "1.3.4", "bs-snippet-injector": "^2.0.1", - "chokidar": "^3.4.1", + "chokidar": "^3.5.1", "connect": "3.6.6", "connect-history-api-fallback": "^1", "dev-ip": "^1.0.1", @@ -14624,10 +14503,10 @@ "fs-extra": "3.0.1", "http-proxy": "^1.18.1", "immutable": "^3", - "localtunnel": "^2.0.0", + "localtunnel": "^2.0.1", "micromatch": "^4.0.2", "opn": "5.3.0", - "portscanner": "2.1.1", + "portscanner": "2.2.0", "qs": "6.2.3", "raw-body": "^2.3.2", "resp-modifier": "6.0.2", @@ -14636,15 +14515,30 @@ "serve-index": "1.9.1", "serve-static": "1.13.2", "server-destroy": "1.0.1", - "socket.io": "2.1.1", - "ua-parser-js": "^0.7.18", - "yargs": "^15.4.1" + "socket.io": "^4.4.1", + "ua-parser-js": "1.0.2", + "yargs": "^17.3.1" }, "dependencies": { + "ansi-regex": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", + "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", + "dev": true + }, + "ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "dev": true, + "requires": { + "color-convert": "^2.0.1" + } + }, "anymatch": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-3.1.1.tgz", - "integrity": "sha512-mM8522psRCqzV+6LhomX5wgp25YVibjh8Wj23I5RPkPppSVSjyKD2A2mBJmWGa+KN7f2D6LNh9jkBCeyLktzjg==", + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-3.1.2.tgz", + "integrity": "sha512-P43ePfOAIupkguHUycrc4qJ9kz8ZiuOUijaETwX7THt0Y/GNK7v0aa8rY816xWjZ7rJdA5XdMcpVFTKMq+RvWg==", "dev": true, "requires": { "normalize-path": "^3.0.0", @@ -14652,9 +14546,9 @@ } }, "binary-extensions": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-2.1.0.tgz", - "integrity": "sha512-1Yj8h9Q+QDF5FzhMs/c9+6UntbD5MkRfRwac8DoEm9ZfUBZ7tZ55YcGVAzEe4bXsdQHEk+s9S5wsOKVdZrw0tQ==", + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-2.2.0.tgz", + "integrity": "sha512-jDctJ/IVQbZoJykoeHbhXpOlNBqGNcwXJKJog42E5HDPUwQTSdjCHdihjj0DlnheQ7blbT6dHOafNAiS8ooQKA==", "dev": true }, "braces": { @@ -14667,21 +14561,47 @@ } }, "chokidar": { - "version": "3.4.3", - "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.4.3.tgz", - "integrity": "sha512-DtM3g7juCXQxFVSNPNByEC2+NImtBuxQQvWlHunpJIS5Ocr0lG306cC7FCi7cEA0fzmybPUIl4txBIobk1gGOQ==", + "version": "3.5.3", + "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.5.3.tgz", + "integrity": "sha512-Dr3sfKRP6oTcjf2JmUmFJfeVMvXBdegxB0iVQ5eb2V10uFJUCAS8OByZdVAyVb8xXNz3GjjTgj9kLWsZTqE6kw==", "dev": true, "requires": { - "anymatch": "~3.1.1", + "anymatch": "~3.1.2", "braces": "~3.0.2", - "fsevents": "~2.1.2", - "glob-parent": "~5.1.0", + "fsevents": "~2.3.2", + "glob-parent": "~5.1.2", "is-binary-path": "~2.1.0", "is-glob": "~4.0.1", "normalize-path": "~3.0.0", - "readdirp": "~3.5.0" + "readdirp": "~3.6.0" + } + }, + "cliui": { + "version": "8.0.1", + "resolved": "https://registry.npmjs.org/cliui/-/cliui-8.0.1.tgz", + "integrity": "sha512-BSeNnyus75C4//NQ9gQt1/csTXyo/8Sb+afLAkzAptFuMsod9HFokGNudZpi/oQV73hnVK+sR+5PVRMd+Dr7YQ==", + "dev": true, + "requires": { + "string-width": "^4.2.0", + "strip-ansi": "^6.0.1", + "wrap-ansi": "^7.0.0" + } + }, + "color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "dev": true, + "requires": { + "color-name": "~1.1.4" } }, + "color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", + "dev": true + }, "debug": { "version": "2.6.9", "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", @@ -14691,6 +14611,12 @@ "ms": "2.0.0" } }, + "emoji-regex": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", + "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==", + "dev": true + }, "fill-range": { "version": "7.0.1", "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.0.1.tgz", @@ -14712,16 +14638,16 @@ } }, "fsevents": { - "version": "2.1.3", - "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.1.3.tgz", - "integrity": "sha512-Auw9a4AxqWpa9GUfj370BMPzzyncfBABW8Mab7BGWBYDj4Isgq+cDKtx0i6u9jcX9pQDnswsaaOTgTmA5pEjuQ==", + "version": "2.3.2", + "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.2.tgz", + "integrity": "sha512-xiqMQR4xAeHTuB9uWm+fFRcIOgKBMiOBP+eXiyT7jsgVCq1bkVygt00oASowB7EdtpOHaaPgKt812P9ab+DDKA==", "dev": true, "optional": true }, "glob-parent": { - "version": "5.1.1", - "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.1.tgz", - "integrity": "sha512-FnI+VGOpnlGHWZxthPGR+QhR78fuiK0sNLkHQv+bL9fQi57lNNdquIbna/WrfROrolq8GK5Ek6BiMwqL/voRYQ==", + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz", + "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==", "dev": true, "requires": { "is-glob": "^4.0.1" @@ -14754,6 +14680,12 @@ "binary-extensions": "^2.0.0" } }, + "is-fullwidth-code-point": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", + "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==", + "dev": true + }, "is-number": { "version": "7.0.0", "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz", @@ -14807,9 +14739,9 @@ "dev": true }, "readdirp": { - "version": "3.5.0", - "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-3.5.0.tgz", - "integrity": "sha512-cMhu7c/8rdhkHXWsY+osBhfSy0JikwpHK/5+imo+LpeasTF8ouErHrlYkwT0++njiyuDvc7OFY5T3ukvZ8qmFQ==", + "version": "3.6.0", + "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-3.6.0.tgz", + "integrity": "sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA==", "dev": true, "requires": { "picomatch": "^2.2.1" @@ -14860,6 +14792,26 @@ "integrity": "sha512-zhSCtt8v2NDrRlPQpCNtw/heZLtfUDqxBM1udqikb/Hbk52LK4nQSwr10u77iopCW5LsyHpuXS0GnEc48mLeew==", "dev": true }, + "string-width": { + "version": "4.2.3", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", + "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", + "dev": true, + "requires": { + "emoji-regex": "^8.0.0", + "is-fullwidth-code-point": "^3.0.0", + "strip-ansi": "^6.0.1" + } + }, + "strip-ansi": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", + "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", + "dev": true, + "requires": { + "ansi-regex": "^5.0.1" + } + }, "to-regex-range": { "version": "5.0.1", "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz", @@ -14868,32 +14820,71 @@ "requires": { "is-number": "^7.0.0" } + }, + "wrap-ansi": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz", + "integrity": "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==", + "dev": true, + "requires": { + "ansi-styles": "^4.0.0", + "string-width": "^4.1.0", + "strip-ansi": "^6.0.0" + } + }, + "y18n": { + "version": "5.0.8", + "resolved": "https://registry.npmjs.org/y18n/-/y18n-5.0.8.tgz", + "integrity": "sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA==", + "dev": true + }, + "yargs": { + "version": "17.6.2", + "resolved": "https://registry.npmjs.org/yargs/-/yargs-17.6.2.tgz", + "integrity": "sha512-1/9UrdHjDZc0eOU0HxOHoS78C69UD3JRMvzlJ7S79S2nTaWRA/whGCTV8o9e/N/1Va9YIV7Q4sOxD8VV4pCWOw==", + "dev": true, + "requires": { + "cliui": "^8.0.1", + "escalade": "^3.1.1", + "get-caller-file": "^2.0.5", + "require-directory": "^2.1.1", + "string-width": "^4.2.3", + "y18n": "^5.0.5", + "yargs-parser": "^21.1.1" + } + }, + "yargs-parser": { + "version": "21.1.1", + "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-21.1.1.tgz", + "integrity": "sha512-tVpsJW7DdjecAiFpbIB1e3qxIQsE6NoPc5/eTdrbbIC4h0LVsWhnoa3g+m2HclBIujHzsxZ4VJVA+GUuc2/LBw==", + "dev": true } } }, "browser-sync-client": { - "version": "2.26.13", - "resolved": "https://registry.npmjs.org/browser-sync-client/-/browser-sync-client-2.26.13.tgz", - "integrity": "sha512-p2VbZoYrpuDhkreq+/Sv1MkToHklh7T1OaIntDwpG6Iy2q/XkBcgwPcWjX+WwRNiZjN8MEehxIjEUh12LweLmQ==", + "version": "2.27.10", + "resolved": "https://registry.npmjs.org/browser-sync-client/-/browser-sync-client-2.27.10.tgz", + "integrity": "sha512-KCFKA1YDj6cNul0VsA28apohtBsdk5Wv8T82ClOZPZMZWxPj4Ny5AUbrj9UlAb/k6pdxE5HABrWDhP9+cjt4HQ==", "dev": true, "requires": { "etag": "1.8.1", "fresh": "0.5.2", "mitt": "^1.1.3", - "rxjs": "^5.5.6" + "rxjs": "^5.5.6", + "typescript": "^4.6.2" } }, "browser-sync-ui": { - "version": "2.26.13", - "resolved": "https://registry.npmjs.org/browser-sync-ui/-/browser-sync-ui-2.26.13.tgz", - "integrity": "sha512-6NJ/pCnhCnBMzaty1opWo7ipDmFAIk8U71JMQGKJxblCUaGfdsbF2shf6XNZSkXYia1yS0vwKu9LIOzpXqQZCA==", + "version": "2.27.10", + "resolved": "https://registry.npmjs.org/browser-sync-ui/-/browser-sync-ui-2.27.10.tgz", + "integrity": "sha512-elbJILq4Uo6OQv6gsvS3Y9vRAJlWu+h8j0JDkF0X/ua+3S6SVbbiWnZc8sNOFlG7yvVGIwBED3eaYQ0iBo1Dtw==", "dev": true, "requires": { "async-each-series": "0.1.1", "connect-history-api-fallback": "^1", "immutable": "^3", "server-destroy": "1.0.1", - "socket.io-client": "^2.0.4", + "socket.io-client": "^4.4.1", "stream-throttle": "^0.1.3" } }, @@ -15139,12 +15130,6 @@ "caller-callsite": "^2.0.0" } }, - "callsite": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/callsite/-/callsite-1.0.0.tgz", - "integrity": "sha1-KAOY5dZkvXQDi28JBRU+borxvCA=", - "dev": true - }, "callsites": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/callsites/-/callsites-2.0.0.tgz", @@ -15423,24 +15408,12 @@ "integrity": "sha1-3dgA2gxmEnOTzKWVDqloo6rxJTs=", "dev": true }, - "component-bind": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/component-bind/-/component-bind-1.0.0.tgz", - "integrity": "sha1-AMYIq33Nk4l8AAllGx06jh5zu9E=", - "dev": true - }, "component-emitter": { "version": "1.3.0", "resolved": "https://registry.npmjs.org/component-emitter/-/component-emitter-1.3.0.tgz", "integrity": "sha512-Rd3se6QB+sO1TwqZjscQrurpEPIfO0/yYnSin6Q/rD3mOutHvUrCAhJub3r90uNb+SESBuE0QYoB90YdfatsRg==", "dev": true }, - "component-inherit": { - "version": "0.0.3", - "resolved": "https://registry.npmjs.org/component-inherit/-/component-inherit-0.0.3.tgz", - "integrity": "sha1-ZF/ErfWLcrZJ1crmUTVhnbJv8UM=", - "dev": true - }, "compressible": { "version": "2.0.18", "resolved": "https://registry.npmjs.org/compressible/-/compressible-2.0.18.tgz", @@ -15666,6 +15639,16 @@ "integrity": "sha1-tf1UIgqivFq1eqtxQMlAdUUDwac=", "dev": true }, + "cors": { + "version": "2.8.5", + "resolved": "https://registry.npmjs.org/cors/-/cors-2.8.5.tgz", + "integrity": "sha512-KIHbLJqu73RGr/hnbrO9uBeixNGuvSQjul/jdFvS/KFSIH1hWVd1ng7zOHx+YrEfInLG7q4n6GHQ9cDtxv/P6g==", + "dev": true, + "requires": { + "object-assign": "^4", + "vary": "^1" + } + }, "cosmiconfig": { "version": "5.2.1", "resolved": "https://registry.npmjs.org/cosmiconfig/-/cosmiconfig-5.2.1.tgz", @@ -16055,9 +16038,9 @@ "dev": true }, "debug": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.2.0.tgz", - "integrity": "sha512-IX2ncY78vDTjZMFUdmsvIRFY2Cf4FnD0wRs+nQwJU8Lu99/tPFdb0VybiiMTPe3I6rQmwsqQqRBvxU+bZ/I8sg==", + "version": "4.3.2", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.2.tgz", + "integrity": "sha512-mOp8wKcvj7XxC78zLgw/ZA+6TSgkoE2C/ienthhRD298T7UNwAg9diBpLRxC0mOezLl4B0xV7M0cCO6P/O0Xhw==", "dev": true, "requires": { "ms": "2.1.2" @@ -16447,135 +16430,71 @@ "version": "1.4.4", "resolved": "https://registry.npmjs.org/end-of-stream/-/end-of-stream-1.4.4.tgz", "integrity": "sha512-+uw1inIHVPQoaVuHzRyXd21icM+cnt4CzD5rW+NC1wjOUSTOs+Te7FOv7AhN7vS9x/oIyhLP5PR1H+phQAHu5Q==", - "dev": true, - "requires": { - "once": "^1.4.0" - } - }, - "engine.io": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/engine.io/-/engine.io-3.2.1.tgz", - "integrity": "sha512-+VlKzHzMhaU+GsCIg4AoXF1UdDFjHHwMmMKqMJNDNLlUlejz58FCy4LBqB2YVJskHGYl06BatYWKP2TVdVXE5w==", - "dev": true, - "requires": { - "accepts": "~1.3.4", - "base64id": "1.0.0", - "cookie": "0.3.1", - "debug": "~3.1.0", - "engine.io-parser": "~2.1.0", - "ws": "~3.3.1" - }, - "dependencies": { - "base64-arraybuffer": { - "version": "0.1.5", - "resolved": "https://registry.npmjs.org/base64-arraybuffer/-/base64-arraybuffer-0.1.5.tgz", - "integrity": "sha1-c5JncZI7Whl0etZmqlzUv5xunOg=", - "dev": true - }, - "cookie": { - "version": "0.3.1", - "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.3.1.tgz", - "integrity": "sha1-5+Ch+e9DtMi6klxcWpboBtFoc7s=", - "dev": true - }, - "debug": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/debug/-/debug-3.1.0.tgz", - "integrity": "sha512-OX8XqP7/1a9cqkxYw2yXss15f26NKWBpDXQd0/uK/KPqdQhxbPa994hnzjcE2VqQpDslf55723cKPUOGSmMY3g==", - "dev": true, - "requires": { - "ms": "2.0.0" - } - }, - "engine.io-parser": { - "version": "2.1.3", - "resolved": "https://registry.npmjs.org/engine.io-parser/-/engine.io-parser-2.1.3.tgz", - "integrity": "sha512-6HXPre2O4Houl7c4g7Ic/XzPnHBvaEmN90vtRO9uLmwtRqQmTOw0QMevL1TOfL2Cpu1VzsaTmMotQgMdkzGkVA==", - "dev": true, - "requires": { - "after": "0.8.2", - "arraybuffer.slice": "~0.0.7", - "base64-arraybuffer": "0.1.5", - "blob": "0.0.5", - "has-binary2": "~1.0.2" - } - }, - "ms": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", - "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=", + "dev": true, + "requires": { + "once": "^1.4.0" + } + }, + "engine.io": { + "version": "6.2.0", + "resolved": "https://registry.npmjs.org/engine.io/-/engine.io-6.2.0.tgz", + "integrity": "sha512-4KzwW3F3bk+KlzSOY57fj/Jx6LyRQ1nbcyIadehl+AnXjKT7gDO0ORdRi/84ixvMKTym6ZKuxvbzN62HDDU1Lg==", + "dev": true, + "requires": { + "@types/cookie": "^0.4.1", + "@types/cors": "^2.8.12", + "@types/node": ">=10.0.0", + "accepts": "~1.3.4", + "base64id": "2.0.0", + "cookie": "~0.4.1", + "cors": "~2.8.5", + "debug": "~4.3.1", + "engine.io-parser": "~5.0.3", + "ws": "~8.2.3" + }, + "dependencies": { + "cookie": { + "version": "0.4.2", + "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.4.2.tgz", + "integrity": "sha512-aSWTXFzaKWkvHO1Ny/s+ePFpvKsPnjc551iI41v3ny/ow6tBG5Vd+FuqGNhh1LxOmVzOlGUriIlOaokOvhaStA==", "dev": true }, "ws": { - "version": "3.3.3", - "resolved": "https://registry.npmjs.org/ws/-/ws-3.3.3.tgz", - "integrity": "sha512-nnWLa/NwZSt4KQJu51MYlCcSQ5g7INpOrOMt4XV8j4dqTXdmlUmSHQ8/oLC069ckre0fRsgfvsKwbTdtKLCDkA==", + "version": "8.2.3", + "resolved": "https://registry.npmjs.org/ws/-/ws-8.2.3.tgz", + "integrity": "sha512-wBuoj1BDpC6ZQ1B7DWQBYVLphPWkm8i9Y0/3YdHjHKHiohOJ1ws+3OccDWtH+PoC9DZD5WOTrJvNbWvjS6JWaA==", "dev": true, - "requires": { - "async-limiter": "~1.0.0", - "safe-buffer": "~5.1.0", - "ultron": "~1.1.0" - } + "requires": {} } } }, "engine.io-client": { - "version": "3.4.4", - "resolved": "https://registry.npmjs.org/engine.io-client/-/engine.io-client-3.4.4.tgz", - "integrity": "sha512-iU4CRr38Fecj8HoZEnFtm2EiKGbYZcPn3cHxqNGl/tmdWRf60KhK+9vE0JeSjgnlS/0oynEfLgKbT9ALpim0sQ==", + "version": "6.2.3", + "resolved": "https://registry.npmjs.org/engine.io-client/-/engine.io-client-6.2.3.tgz", + "integrity": "sha512-aXPtgF1JS3RuuKcpSrBtimSjYvrbhKW9froICH4s0F3XQWLxsKNxqzG39nnvQZQnva4CMvUK63T7shevxRyYHw==", "dev": true, "requires": { - "component-emitter": "~1.3.0", - "component-inherit": "0.0.3", - "debug": "~3.1.0", - "engine.io-parser": "~2.2.0", - "has-cors": "1.1.0", - "indexof": "0.0.1", - "parseqs": "0.0.6", - "parseuri": "0.0.6", - "ws": "~6.1.0", - "xmlhttprequest-ssl": "~1.5.4", - "yeast": "0.1.2" + "@socket.io/component-emitter": "~3.1.0", + "debug": "~4.3.1", + "engine.io-parser": "~5.0.3", + "ws": "~8.2.3", + "xmlhttprequest-ssl": "~2.0.0" }, "dependencies": { - "debug": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/debug/-/debug-3.1.0.tgz", - "integrity": "sha512-OX8XqP7/1a9cqkxYw2yXss15f26NKWBpDXQd0/uK/KPqdQhxbPa994hnzjcE2VqQpDslf55723cKPUOGSmMY3g==", - "dev": true, - "requires": { - "ms": "2.0.0" - } - }, - "ms": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", - "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=", - "dev": true - }, "ws": { - "version": "6.1.4", - "resolved": "https://registry.npmjs.org/ws/-/ws-6.1.4.tgz", - "integrity": "sha512-eqZfL+NE/YQc1/ZynhojeV8q+H050oR8AZ2uIev7RU10svA9ZnJUddHcOUZTJLinZ9yEfdA2kSATS2qZK5fhJA==", + "version": "8.2.3", + "resolved": "https://registry.npmjs.org/ws/-/ws-8.2.3.tgz", + "integrity": "sha512-wBuoj1BDpC6ZQ1B7DWQBYVLphPWkm8i9Y0/3YdHjHKHiohOJ1ws+3OccDWtH+PoC9DZD5WOTrJvNbWvjS6JWaA==", "dev": true, - "requires": { - "async-limiter": "~1.0.0" - } + "requires": {} } } }, "engine.io-parser": { - "version": "2.2.1", - "resolved": "https://registry.npmjs.org/engine.io-parser/-/engine.io-parser-2.2.1.tgz", - "integrity": "sha512-x+dN/fBH8Ro8TFwJ+rkB2AmuVw9Yu2mockR/p3W8f8YtExwFgDvBDi0GWyb4ZLkpahtDGZgtr3zLovanJghPqg==", - "dev": true, - "requires": { - "after": "0.8.2", - "arraybuffer.slice": "~0.0.7", - "base64-arraybuffer": "0.1.4", - "blob": "0.0.5", - "has-binary2": "~1.0.2" - } + "version": "5.0.4", + "resolved": "https://registry.npmjs.org/engine.io-parser/-/engine.io-parser-5.0.4.tgz", + "integrity": "sha512-+nVFp+5z1E3HcToEnO7ZIj3g+3k9389DvWtvJZz0T6/eOCPIyyxehFcedoYrZQrp0LgQbD9pPXhpMBKMd5QURg==", + "dev": true }, "enhanced-resolve": { "version": "4.3.0", @@ -17207,9 +17126,9 @@ } }, "follow-redirects": { - "version": "1.13.0", - "resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.13.0.tgz", - "integrity": "sha512-aq6gF1BEKje4a9i9+5jimNFIpq4Q1WiwBToeRK5NvZBd/TRsmW8BsJfOEGkr76TbOyPVD3OVDN910EcUNtRYEA==", + "version": "1.15.2", + "resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.15.2.tgz", + "integrity": "sha512-VQLG33o04KaQ8uYi2tVNbdrWp1QWxNNea+nmIB4EVM28v0hmP17z7aG1+wAkNzVq4KeXTq3221ye5qTJP91JwA==", "dev": true }, "for-in": { @@ -17510,29 +17429,6 @@ "ansi-regex": "^2.0.0" } }, - "has-binary2": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/has-binary2/-/has-binary2-1.0.3.tgz", - "integrity": "sha512-G1LWKhDSvhGeAQ8mPVQlqNcOB2sJdwATtZKl2pDKKHfpf/rYj24lkinxf69blJbnsvtqqNU+L3SL50vzZhXOnw==", - "dev": true, - "requires": { - "isarray": "2.0.1" - }, - "dependencies": { - "isarray": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/isarray/-/isarray-2.0.1.tgz", - "integrity": "sha1-o32U7ZzaLVmGXJ92/llu4fM4dB4=", - "dev": true - } - } - }, - "has-cors": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/has-cors/-/has-cors-1.1.0.tgz", - "integrity": "sha1-XkdHk/fqmEPRu5nCPu9J/xJv/zk=", - "dev": true - }, "has-flag": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", @@ -17889,7 +17785,7 @@ "immutable": { "version": "3.8.2", "resolved": "https://registry.npmjs.org/immutable/-/immutable-3.8.2.tgz", - "integrity": "sha1-wkOZUUVbs5kT2vKBN28VMOEErfM=", + "integrity": "sha512-15gZoQ38eYjEjxkorfbcgBKBL6R7T459OuK+CpcWt7O3KF4uPCx2tD0uFETlUDIyo+1789crbMhTvQBSR5yBMg==", "dev": true }, "import-cwd": { @@ -17953,12 +17849,6 @@ "integrity": "sha1-8w9xbI4r00bHtn0985FVZqfAVgc=", "dev": true }, - "indexof": { - "version": "0.0.1", - "resolved": "https://registry.npmjs.org/indexof/-/indexof-0.0.1.tgz", - "integrity": "sha1-gtwzbSMrkGIXnQWrMpOmYFn9Q10=", - "dev": true - }, "infer-owner": { "version": "1.0.4", "resolved": "https://registry.npmjs.org/infer-owner/-/infer-owner-1.0.4.tgz", @@ -18523,69 +18413,127 @@ } }, "localtunnel": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/localtunnel/-/localtunnel-2.0.0.tgz", - "integrity": "sha512-g6E0aLgYYDvQDxIjIXkgJo2+pHj3sGg4Wz/XP3h2KtZnRsWPbOQY+hw1H8Z91jep998fkcVE9l+kghO+97vllg==", + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/localtunnel/-/localtunnel-2.0.2.tgz", + "integrity": "sha512-n418Cn5ynvJd7m/N1d9WVJISLJF/ellZnfsLnx8WBWGzxv/ntNcFkJ1o6se5quUhCplfLGBNL5tYHiq5WF3Nug==", "dev": true, "requires": { - "axios": "0.19.0", - "debug": "4.1.1", + "axios": "0.21.4", + "debug": "4.3.2", "openurl": "1.1.1", - "yargs": "13.3.0" + "yargs": "17.1.1" }, "dependencies": { "ansi-regex": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-4.1.0.tgz", - "integrity": "sha512-1apePfXM1UOSqw0o9IiFAovVz9M5S1Dg+4TrDwfMewQ6p/rmMueb7tWZjQ1rx4Loy1ArBggoqGpfqqdI4rondg==", + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", + "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", "dev": true }, - "debug": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.1.1.tgz", - "integrity": "sha512-pYAIzeRo8J6KPEaJ0VWOh5Pzkbw/RetuzehGM7QRRX5he4fPHx2rdKMB256ehJCkX+XRQm16eZLqLNS8RSZXZw==", + "ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", "dev": true, "requires": { - "ms": "^2.1.1" + "color-convert": "^2.0.1" + } + }, + "cliui": { + "version": "7.0.4", + "resolved": "https://registry.npmjs.org/cliui/-/cliui-7.0.4.tgz", + "integrity": "sha512-OcRE68cOsVMXp1Yvonl/fzkQOyjLSu/8bhPDfQt0e0/Eb283TKP20Fs2MqoPsr9SwA595rRCA+QMzYc9nBP+JQ==", + "dev": true, + "requires": { + "string-width": "^4.2.0", + "strip-ansi": "^6.0.0", + "wrap-ansi": "^7.0.0" + } + }, + "color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "dev": true, + "requires": { + "color-name": "~1.1.4" } }, + "color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", + "dev": true + }, + "emoji-regex": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", + "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==", + "dev": true + }, + "is-fullwidth-code-point": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", + "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==", + "dev": true + }, "string-width": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-3.1.0.tgz", - "integrity": "sha512-vafcv6KjVZKSgz06oM/H6GDBrAtz8vdhQakGjFIvNrHA6y3HCF1CInLy+QLq8dTJPQ1b+KDUqDFctkdRW44e1w==", + "version": "4.2.3", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", + "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", "dev": true, "requires": { - "emoji-regex": "^7.0.1", - "is-fullwidth-code-point": "^2.0.0", - "strip-ansi": "^5.1.0" + "emoji-regex": "^8.0.0", + "is-fullwidth-code-point": "^3.0.0", + "strip-ansi": "^6.0.1" } }, "strip-ansi": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-5.2.0.tgz", - "integrity": "sha512-DuRs1gKbBqsMKIZlrffwlug8MHkcnpjs5VPmL1PAh+mA30U0DTotfDZ0d2UUsXpPmPmMMJ6W773MaA3J+lbiWA==", + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", + "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", "dev": true, "requires": { - "ansi-regex": "^4.1.0" + "ansi-regex": "^5.0.1" } }, + "wrap-ansi": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz", + "integrity": "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==", + "dev": true, + "requires": { + "ansi-styles": "^4.0.0", + "string-width": "^4.1.0", + "strip-ansi": "^6.0.0" + } + }, + "y18n": { + "version": "5.0.8", + "resolved": "https://registry.npmjs.org/y18n/-/y18n-5.0.8.tgz", + "integrity": "sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA==", + "dev": true + }, "yargs": { - "version": "13.3.0", - "resolved": "https://registry.npmjs.org/yargs/-/yargs-13.3.0.tgz", - "integrity": "sha512-2eehun/8ALW8TLoIl7MVaRUrg+yCnenu8B4kBlRxj3GJGDKU1Og7sMXPNm1BYyM1DOJmTZ4YeN/Nwxv+8XJsUA==", + "version": "17.1.1", + "resolved": "https://registry.npmjs.org/yargs/-/yargs-17.1.1.tgz", + "integrity": "sha512-c2k48R0PwKIqKhPMWjeiF6y2xY/gPMUlro0sgxqXpbOIohWiLNXWslsootttv7E1e73QPAMQSg5FeySbVcpsPQ==", "dev": true, "requires": { - "cliui": "^5.0.0", - "find-up": "^3.0.0", - "get-caller-file": "^2.0.1", + "cliui": "^7.0.2", + "escalade": "^3.1.1", + "get-caller-file": "^2.0.5", "require-directory": "^2.1.1", - "require-main-filename": "^2.0.0", - "set-blocking": "^2.0.0", - "string-width": "^3.0.0", - "which-module": "^2.0.0", - "y18n": "^4.0.0", - "yargs-parser": "^13.1.1" + "string-width": "^4.2.0", + "y18n": "^5.0.5", + "yargs-parser": "^20.2.2" } + }, + "yargs-parser": { + "version": "20.2.9", + "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-20.2.9.tgz", + "integrity": "sha512-y11nGElTIV+CT3Zv9t7VKl+Q3hTQoT9a1Qzezhhl6Rp21gJ/IVTW7Z3y9EWXhuUBC2Shnf+DX0antecpAwSP8w==", + "dev": true } } }, @@ -18608,7 +18556,7 @@ "lodash.isfinite": { "version": "3.3.2", "resolved": "https://registry.npmjs.org/lodash.isfinite/-/lodash.isfinite-3.3.2.tgz", - "integrity": "sha1-+4m2WpqAKBgz8LdHizpRBPiY67M=", + "integrity": "sha512-7FGG40uhC8Mm633uKW1r58aElFlBlxCrg9JfSi3P6aYiWmfiWF0PgMd86ZUsxE5GwWPdHoS2+48bwTh2VPkIQA==", "dev": true }, "lodash.memoize": { @@ -19135,12 +19083,6 @@ "integrity": "sha1-IQmtx5ZYh8/AXLvUQsrIv7s2CGM=", "dev": true }, - "object-component": { - "version": "0.0.3", - "resolved": "https://registry.npmjs.org/object-component/-/object-component-0.0.3.tgz", - "integrity": "sha1-8MaapQ78lbhmwYb0AKM3acsvEpE=", - "dev": true - }, "object-copy": { "version": "0.1.0", "resolved": "https://registry.npmjs.org/object-copy/-/object-copy-0.1.0.tgz", @@ -19330,7 +19272,7 @@ "openurl": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/openurl/-/openurl-1.1.1.tgz", - "integrity": "sha1-OHW0sO96UsFW8NtB1GCduw+Us4c=", + "integrity": "sha512-d/gTkTb1i1GKz5k3XE3XFV/PxQ1k45zDqGP2OA7YhgsaLoqm6qRvARAZOFer1fcXritWlGBRCu/UgeS4HAnXAA==", "dev": true }, "opn": { @@ -19476,18 +19418,6 @@ "integrity": "sha1-bVuTSkVpk7I9N/QKOC1vFmao5cY=", "dev": true }, - "parseqs": { - "version": "0.0.6", - "resolved": "https://registry.npmjs.org/parseqs/-/parseqs-0.0.6.tgz", - "integrity": "sha512-jeAGzMDbfSHHA091hr0r31eYfTig+29g3GKKE/PPbEQ65X0lmMwlEoqmhzu0iztID5uJpZsFlUPDP8ThPL7M8w==", - "dev": true - }, - "parseuri": { - "version": "0.0.6", - "resolved": "https://registry.npmjs.org/parseuri/-/parseuri-0.0.6.tgz", - "integrity": "sha512-AUjen8sAkGgao7UyCX6Ahv0gIK2fABKmYjvP4xmy5JaKvcbTRueIqIPHLAfq30xJddqSE033IOMUSOMCcK3Sow==", - "dev": true - }, "parseurl": { "version": "1.3.3", "resolved": "https://registry.npmjs.org/parseurl/-/parseurl-1.3.3.tgz", @@ -19648,21 +19578,13 @@ } }, "portscanner": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/portscanner/-/portscanner-2.1.1.tgz", - "integrity": "sha1-6rtAnk3iSVD1oqUW01rnaTQ/u5Y=", + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/portscanner/-/portscanner-2.2.0.tgz", + "integrity": "sha512-IFroCz/59Lqa2uBvzK3bKDbDDIEaAY8XJ1jFxcLWTqosrsc32//P4VuSB2vZXoHiHqOmx8B5L5hnKOxL/7FlPw==", "dev": true, "requires": { - "async": "1.5.2", + "async": "^2.6.0", "is-number-like": "^1.0.3" - }, - "dependencies": { - "async": { - "version": "1.5.2", - "resolved": "https://registry.npmjs.org/async/-/async-1.5.2.tgz", - "integrity": "sha1-7GphrlZIDAw8skHJVhjiCJL5Zyo=", - "dev": true - } } }, "posix-character-classes": { @@ -21125,7 +21047,7 @@ "server-destroy": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/server-destroy/-/server-destroy-1.0.1.tgz", - "integrity": "sha1-8Tv5KOQrnD55OD5hzDmYtdFObN0=", + "integrity": "sha512-rb+9B5YBIEzYcD6x2VKidaa+cqYBJQKnU4oe4E3ANwRRN56yk/ua1YCJT1n21NTS8w6CcOclAKNP3PhdCXKYtQ==", "dev": true }, "set-blocking": { @@ -21373,222 +21295,45 @@ } }, "socket.io": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/socket.io/-/socket.io-2.1.1.tgz", - "integrity": "sha512-rORqq9c+7W0DAK3cleWNSyfv/qKXV99hV4tZe+gGLfBECw3XEhBy7x85F3wypA9688LKjtwO9pX9L33/xQI8yA==", + "version": "4.5.3", + "resolved": "https://registry.npmjs.org/socket.io/-/socket.io-4.5.3.tgz", + "integrity": "sha512-zdpnnKU+H6mOp7nYRXH4GNv1ux6HL6+lHL8g7Ds7Lj8CkdK1jJK/dlwsKDculbyOHifcJ0Pr/yeXnZQ5GeFrcg==", "dev": true, "requires": { - "debug": "~3.1.0", - "engine.io": "~3.2.0", - "has-binary2": "~1.0.2", - "socket.io-adapter": "~1.1.0", - "socket.io-client": "2.1.1", - "socket.io-parser": "~3.2.0" - }, - "dependencies": { - "base64-arraybuffer": { - "version": "0.1.5", - "resolved": "https://registry.npmjs.org/base64-arraybuffer/-/base64-arraybuffer-0.1.5.tgz", - "integrity": "sha1-c5JncZI7Whl0etZmqlzUv5xunOg=", - "dev": true - }, - "component-emitter": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/component-emitter/-/component-emitter-1.2.1.tgz", - "integrity": "sha1-E3kY1teCg/ffemt8WmPhQOaUJeY=", - "dev": true - }, - "debug": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/debug/-/debug-3.1.0.tgz", - "integrity": "sha512-OX8XqP7/1a9cqkxYw2yXss15f26NKWBpDXQd0/uK/KPqdQhxbPa994hnzjcE2VqQpDslf55723cKPUOGSmMY3g==", - "dev": true, - "requires": { - "ms": "2.0.0" - } - }, - "engine.io-client": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/engine.io-client/-/engine.io-client-3.2.1.tgz", - "integrity": "sha512-y5AbkytWeM4jQr7m/koQLc5AxpRKC1hEVUb/s1FUAWEJq5AzJJ4NLvzuKPuxtDi5Mq755WuDvZ6Iv2rXj4PTzw==", - "dev": true, - "requires": { - "component-emitter": "1.2.1", - "component-inherit": "0.0.3", - "debug": "~3.1.0", - "engine.io-parser": "~2.1.1", - "has-cors": "1.1.0", - "indexof": "0.0.1", - "parseqs": "0.0.5", - "parseuri": "0.0.5", - "ws": "~3.3.1", - "xmlhttprequest-ssl": "~1.5.4", - "yeast": "0.1.2" - } - }, - "engine.io-parser": { - "version": "2.1.3", - "resolved": "https://registry.npmjs.org/engine.io-parser/-/engine.io-parser-2.1.3.tgz", - "integrity": "sha512-6HXPre2O4Houl7c4g7Ic/XzPnHBvaEmN90vtRO9uLmwtRqQmTOw0QMevL1TOfL2Cpu1VzsaTmMotQgMdkzGkVA==", - "dev": true, - "requires": { - "after": "0.8.2", - "arraybuffer.slice": "~0.0.7", - "base64-arraybuffer": "0.1.5", - "blob": "0.0.5", - "has-binary2": "~1.0.2" - } - }, - "isarray": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/isarray/-/isarray-2.0.1.tgz", - "integrity": "sha1-o32U7ZzaLVmGXJ92/llu4fM4dB4=", - "dev": true - }, - "ms": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", - "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=", - "dev": true - }, - "parseqs": { - "version": "0.0.5", - "resolved": "https://registry.npmjs.org/parseqs/-/parseqs-0.0.5.tgz", - "integrity": "sha1-1SCKNzjkZ2bikbouoXNoSSGouJ0=", - "dev": true, - "requires": { - "better-assert": "~1.0.0" - } - }, - "parseuri": { - "version": "0.0.5", - "resolved": "https://registry.npmjs.org/parseuri/-/parseuri-0.0.5.tgz", - "integrity": "sha1-gCBKUNTbt3m/3G6+J3jZDkvOMgo=", - "dev": true, - "requires": { - "better-assert": "~1.0.0" - } - }, - "socket.io-client": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/socket.io-client/-/socket.io-client-2.1.1.tgz", - "integrity": "sha512-jxnFyhAuFxYfjqIgduQlhzqTcOEQSn+OHKVfAxWaNWa7ecP7xSNk2Dx/3UEsDcY7NcFafxvNvKPmmO7HTwTxGQ==", - "dev": true, - "requires": { - "backo2": "1.0.2", - "base64-arraybuffer": "0.1.5", - "component-bind": "1.0.0", - "component-emitter": "1.2.1", - "debug": "~3.1.0", - "engine.io-client": "~3.2.0", - "has-binary2": "~1.0.2", - "has-cors": "1.1.0", - "indexof": "0.0.1", - "object-component": "0.0.3", - "parseqs": "0.0.5", - "parseuri": "0.0.5", - "socket.io-parser": "~3.2.0", - "to-array": "0.1.4" - } - }, - "socket.io-parser": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/socket.io-parser/-/socket.io-parser-3.2.0.tgz", - "integrity": "sha512-FYiBx7rc/KORMJlgsXysflWx/RIvtqZbyGLlHZvjfmPTPeuD/I8MaW7cfFrj5tRltICJdgwflhfZ3NVVbVLFQA==", - "dev": true, - "requires": { - "component-emitter": "1.2.1", - "debug": "~3.1.0", - "isarray": "2.0.1" - } - }, - "ws": { - "version": "3.3.3", - "resolved": "https://registry.npmjs.org/ws/-/ws-3.3.3.tgz", - "integrity": "sha512-nnWLa/NwZSt4KQJu51MYlCcSQ5g7INpOrOMt4XV8j4dqTXdmlUmSHQ8/oLC069ckre0fRsgfvsKwbTdtKLCDkA==", - "dev": true, - "requires": { - "async-limiter": "~1.0.0", - "safe-buffer": "~5.1.0", - "ultron": "~1.1.0" - } - } + "accepts": "~1.3.4", + "base64id": "~2.0.0", + "debug": "~4.3.2", + "engine.io": "~6.2.0", + "socket.io-adapter": "~2.4.0", + "socket.io-parser": "~4.2.0" } }, "socket.io-adapter": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/socket.io-adapter/-/socket.io-adapter-1.1.2.tgz", - "integrity": "sha512-WzZRUj1kUjrTIrUKpZLEzFZ1OLj5FwLlAFQs9kuZJzJi5DKdU7FsWc36SNmA8iDOtwBQyT8FkrriRM8vXLYz8g==", + "version": "2.4.0", + "resolved": "https://registry.npmjs.org/socket.io-adapter/-/socket.io-adapter-2.4.0.tgz", + "integrity": "sha512-W4N+o69rkMEGVuk2D/cvca3uYsvGlMwsySWV447y99gUPghxq42BxqLNMndb+a1mm/5/7NeXVQS7RLa2XyXvYg==", "dev": true }, "socket.io-client": { - "version": "2.3.1", - "resolved": "https://registry.npmjs.org/socket.io-client/-/socket.io-client-2.3.1.tgz", - "integrity": "sha512-YXmXn3pA8abPOY//JtYxou95Ihvzmg8U6kQyolArkIyLd0pgVhrfor/iMsox8cn07WCOOvvuJ6XKegzIucPutQ==", + "version": "4.5.3", + "resolved": "https://registry.npmjs.org/socket.io-client/-/socket.io-client-4.5.3.tgz", + "integrity": "sha512-I/hqDYpQ6JKwtJOf5ikM+Qz+YujZPMEl6qBLhxiP0nX+TfXKhW4KZZG8lamrD6Y5ngjmYHreESVasVCgi5Kl3A==", "dev": true, "requires": { - "backo2": "1.0.2", - "component-bind": "1.0.0", - "component-emitter": "~1.3.0", - "debug": "~3.1.0", - "engine.io-client": "~3.4.0", - "has-binary2": "~1.0.2", - "indexof": "0.0.1", - "parseqs": "0.0.6", - "parseuri": "0.0.6", - "socket.io-parser": "~3.3.0", - "to-array": "0.1.4" - }, - "dependencies": { - "debug": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/debug/-/debug-3.1.0.tgz", - "integrity": "sha512-OX8XqP7/1a9cqkxYw2yXss15f26NKWBpDXQd0/uK/KPqdQhxbPa994hnzjcE2VqQpDslf55723cKPUOGSmMY3g==", - "dev": true, - "requires": { - "ms": "2.0.0" - } - }, - "ms": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", - "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=", - "dev": true - } + "@socket.io/component-emitter": "~3.1.0", + "debug": "~4.3.2", + "engine.io-client": "~6.2.3", + "socket.io-parser": "~4.2.0" } }, "socket.io-parser": { - "version": "3.3.1", - "resolved": "https://registry.npmjs.org/socket.io-parser/-/socket.io-parser-3.3.1.tgz", - "integrity": "sha512-1QLvVAe8dTz+mKmZ07Swxt+LAo4Y1ff50rlyoEx00TQmDFVQYPfcqGvIDJLGaBdhdNCecXtyKpD+EgKGcmmbuQ==", + "version": "4.2.1", + "resolved": "https://registry.npmjs.org/socket.io-parser/-/socket.io-parser-4.2.1.tgz", + "integrity": "sha512-V4GrkLy+HeF1F/en3SpUaM+7XxYXpuMUWLGde1kSSh5nQMN4hLrbPIkD+otwh6q9R6NOQBN4AMaOZ2zVjui82g==", "dev": true, "requires": { - "component-emitter": "~1.3.0", - "debug": "~3.1.0", - "isarray": "2.0.1" - }, - "dependencies": { - "debug": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/debug/-/debug-3.1.0.tgz", - "integrity": "sha512-OX8XqP7/1a9cqkxYw2yXss15f26NKWBpDXQd0/uK/KPqdQhxbPa994hnzjcE2VqQpDslf55723cKPUOGSmMY3g==", - "dev": true, - "requires": { - "ms": "2.0.0" - } - }, - "isarray": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/isarray/-/isarray-2.0.1.tgz", - "integrity": "sha1-o32U7ZzaLVmGXJ92/llu4fM4dB4=", - "dev": true - }, - "ms": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", - "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=", - "dev": true - } + "@socket.io/component-emitter": "~3.1.0", + "debug": "~4.3.1" } }, "sockjs": { @@ -21837,7 +21582,7 @@ "stream-throttle": { "version": "0.1.3", "resolved": "https://registry.npmjs.org/stream-throttle/-/stream-throttle-0.1.3.tgz", - "integrity": "sha1-rdV8jXzHOoFjDTHNVdOWHPr7qcM=", + "integrity": "sha512-889+B9vN9dq7/vLbGyuHeZ6/ctf5sNuGWsDy89uNxkFTAgzy0eK7+w5fL3KLNRTkLle7EgZGvHUphZW0Q26MnQ==", "dev": true, "requires": { "commander": "^2.2.0", @@ -21995,7 +21740,7 @@ "symbol-observable": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/symbol-observable/-/symbol-observable-1.0.1.tgz", - "integrity": "sha1-g0D8RwLDEi310iKI+IKD9RPT/dQ=", + "integrity": "sha512-Kb3PrPYz4HanVF1LVGuAdW6LoVgIwjUYJGzFe7NDrBLCN4lsV/5J0MFurV+ygS4bRVwrCEt2c7MQ1R2a72oJDw==", "dev": true }, "tapable": { @@ -22202,12 +21947,6 @@ "integrity": "sha1-QFQRqOfmM5/mTbmiNN4R3DHgK9Q=", "dev": true }, - "to-array": { - "version": "0.1.4", - "resolved": "https://registry.npmjs.org/to-array/-/to-array-0.1.4.tgz", - "integrity": "sha1-F+bBH3PdTz10zaek/zI46a2b+JA=", - "dev": true - }, "to-arraybuffer": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/to-arraybuffer/-/to-arraybuffer-1.0.1.tgz", @@ -22296,10 +22035,16 @@ "integrity": "sha1-hnrHTjhkGHsdPUfZlqeOxciDB3c=", "dev": true }, + "typescript": { + "version": "4.8.4", + "resolved": "https://registry.npmjs.org/typescript/-/typescript-4.8.4.tgz", + "integrity": "sha512-QCh+85mCy+h0IGff8r5XWzOVSbBO+KfeYrMQh7NJ58QujwcE22u+NUSmUxqF+un70P9GXKxa2HCNiTTMJknyjQ==", + "dev": true + }, "ua-parser-js": { - "version": "0.7.31", - "resolved": "https://registry.npmjs.org/ua-parser-js/-/ua-parser-js-0.7.31.tgz", - "integrity": "sha512-qLK/Xe9E2uzmYI3qLeOmI0tEOt+TBBQyUIAh4aAgU05FVYzeZrKUdkAZfBNVGRaHVgV0TDkdEngJSw/SyQchkQ==", + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/ua-parser-js/-/ua-parser-js-1.0.2.tgz", + "integrity": "sha512-00y/AXhx0/SsnI51fTc0rLRmafiGOM4/O+ny10Ps7f+j/b8p/ZY11ytMgznXkOVo4GQ+KwQG5UQLkLGirsACRg==", "dev": true }, "uglify-js": { @@ -22326,12 +22071,6 @@ } } }, - "ultron": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/ultron/-/ultron-1.1.1.tgz", - "integrity": "sha512-UIEXBNeYmKptWH6z8ZnqTeS8fV74zG0/eRU9VGkpzz+LIJNs8W/zM/L+7ctCkRrgbNnnR0xxw4bKOr0cW0N0Og==", - "dev": true - }, "unicode-canonical-property-names-ecmascript": { "version": "1.0.4", "resolved": "https://registry.npmjs.org/unicode-canonical-property-names-ecmascript/-/unicode-canonical-property-names-ecmascript-1.0.4.tgz", @@ -23276,9 +23015,9 @@ } }, "xmlhttprequest-ssl": { - "version": "1.5.5", - "resolved": "https://registry.npmjs.org/xmlhttprequest-ssl/-/xmlhttprequest-ssl-1.5.5.tgz", - "integrity": "sha1-wodrBhaKrcQOV9l+gRkayPQ5iz4=", + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/xmlhttprequest-ssl/-/xmlhttprequest-ssl-2.0.0.tgz", + "integrity": "sha512-QKxVRxiRACQcVuQEYFsI1hhkrMlrXHPegbbd1yn9UHOmRxY+si12nQYzri3vbzt8VdTTRviqcKxcyllFas5z2A==", "dev": true }, "xtend": { @@ -23457,12 +23196,6 @@ "camelcase": "^5.0.0", "decamelize": "^1.2.0" } - }, - "yeast": { - "version": "0.1.2", - "resolved": "https://registry.npmjs.org/yeast/-/yeast-0.1.2.tgz", - "integrity": "sha1-AI4G2AlDIMNy28L47XagymyKxBk=", - "dev": true } } } diff --git a/package.json b/package.json index bf35f0c85c..5161ec3924 100644 --- a/package.json +++ b/package.json @@ -26,7 +26,7 @@ }, "homepage": "https://github.com/AtreNet/prebid.github.io#readme", "devDependencies": { - "browser-sync": "^2.26.13", + "browser-sync": "^2.27.10", "browser-sync-webpack-plugin": "^2.0.1", "cross-env": "^7.0.2", "laravel-mix": "^5.0.7", From 1baa8b4b9b30cfbaa9b8f573e1cbf01533db9998 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Tue, 15 Nov 2022 10:28:33 -0700 Subject: [PATCH 096/280] Bump ansi-html and webpack-dev-server (#4147) Removes [ansi-html](https://github.com/Tjatse/ansi-html). It's no longer used after updating ancestor dependency [webpack-dev-server](https://github.com/webpack/webpack-dev-server). These dependencies need to be updated together. Removes `ansi-html` Updates `webpack-dev-server` from 3.11.0 to 3.11.3 - [Release notes](https://github.com/webpack/webpack-dev-server/releases) - [Changelog](https://github.com/webpack/webpack-dev-server/blob/v3.11.3/CHANGELOG.md) - [Commits](https://github.com/webpack/webpack-dev-server/compare/v3.11.0...v3.11.3) --- updated-dependencies: - dependency-name: ansi-html dependency-type: indirect - dependency-name: webpack-dev-server dependency-type: indirect ... Signed-off-by: dependabot[bot] Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- package-lock.json | 256 ++++++++++++++++++++++------------------------ 1 file changed, 122 insertions(+), 134 deletions(-) diff --git a/package-lock.json b/package-lock.json index 4e12350243..ea68feae60 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1464,10 +1464,10 @@ "node": ">=6" } }, - "node_modules/ansi-html": { - "version": "0.0.7", - "resolved": "https://registry.npmjs.org/ansi-html/-/ansi-html-0.0.7.tgz", - "integrity": "sha1-gTWEAhliqenm/QOflA0S9WynhZ4=", + "node_modules/ansi-html-community": { + "version": "0.0.8", + "resolved": "https://registry.npmjs.org/ansi-html-community/-/ansi-html-community-0.0.8.tgz", + "integrity": "sha512-1APHAyr3+PCamwNw3bXCPp4HFLONZt/yIH0sZp0/469KWNTEy+qN5jQ3GVX6DMZ1UXAi34yVwtTeaG/HpBuuzw==", "dev": true, "engines": [ "node >= 0.8.0" @@ -4754,15 +4754,12 @@ } }, "node_modules/eventsource": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/eventsource/-/eventsource-1.1.1.tgz", - "integrity": "sha512-qV5ZC0h7jYIAOhArFJgSfdyz6rALJyb270714o7ZtNnw2WSJ+eexhKtE0O8LYPRsHZHf2osHKZBxGPvm3kPkCA==", + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/eventsource/-/eventsource-2.0.2.tgz", + "integrity": "sha512-IzUmBGPR3+oUG9dUeXynyNmf91/3zUSJg1lCktzKw47OXuhco54U3r9B7O4XX+Rb1Itm9OZ2b0RkTs10bICOxA==", "dev": true, - "dependencies": { - "original": "^1.0.0" - }, "engines": { - "node": ">=0.12.0" + "node": ">=12.0.0" } }, "node_modules/evp_bytestokey": { @@ -5100,15 +5097,15 @@ "dev": true }, "node_modules/faye-websocket": { - "version": "0.10.0", - "resolved": "https://registry.npmjs.org/faye-websocket/-/faye-websocket-0.10.0.tgz", - "integrity": "sha1-TkkvjQTftviQA1B/btvy1QHnxvQ=", + "version": "0.11.4", + "resolved": "https://registry.npmjs.org/faye-websocket/-/faye-websocket-0.11.4.tgz", + "integrity": "sha512-CzbClwlXAuiRQAlUyfqPgvPoNKTckTPGfwZV4ZdAhVcP2lh9KUxJg2b5GkE7XbjKQ3YJnQ9z6D9ntLAlB+tP8g==", "dev": true, "dependencies": { "websocket-driver": ">=0.5.1" }, "engines": { - "node": ">=0.4.0" + "node": ">=0.8.0" } }, "node_modules/figgy-pudding": { @@ -5915,6 +5912,12 @@ "integrity": "sha1-Yzwsg+PaQqUC9SRmAiSA9CCCYd4=", "dev": true }, + "node_modules/http-parser-js": { + "version": "0.5.8", + "resolved": "https://registry.npmjs.org/http-parser-js/-/http-parser-js-0.5.8.tgz", + "integrity": "sha512-SGeBX54F94Wgu5RH3X5jsDtf4eHyRogWX1XGT3b4HuW3tQPM4AaBzoUji/4AAJNXCEOWZ5O0DgZmJw1947gD5Q==", + "dev": true + }, "node_modules/http-proxy": { "version": "1.18.1", "resolved": "https://registry.npmjs.org/http-proxy/-/http-proxy-1.18.1.tgz", @@ -6714,12 +6717,6 @@ "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==", "dev": true }, - "node_modules/json3": { - "version": "3.3.3", - "resolved": "https://registry.npmjs.org/json3/-/json3-3.3.3.tgz", - "integrity": "sha512-c7/8mbUsKigAbLkD5B010BK4D9LZm7A1pNItkEwiUZRpIN66exu/e7YQWysGun+TRKaJp8MhemM+VkfWv42aCA==", - "dev": true - }, "node_modules/json5": { "version": "2.1.3", "resolved": "https://registry.npmjs.org/json5/-/json5-2.1.3.tgz", @@ -7917,15 +7914,6 @@ "last-call-webpack-plugin": "^3.0.0" } }, - "node_modules/original": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/original/-/original-1.0.2.tgz", - "integrity": "sha512-hyBVl6iqqUOJ8FqRe+l/gS8H+kKYjrEndd5Pm1MfBtsEKA038HkkdbAl/72EAXGyonD/PFsvmVG+EvcIpliMBg==", - "dev": true, - "dependencies": { - "url-parse": "^1.4.3" - } - }, "node_modules/os-browserify": { "version": "0.3.0", "resolved": "https://registry.npmjs.org/os-browserify/-/os-browserify-0.3.0.tgz", @@ -10304,49 +10292,51 @@ } }, "node_modules/sockjs": { - "version": "0.3.20", - "resolved": "https://registry.npmjs.org/sockjs/-/sockjs-0.3.20.tgz", - "integrity": "sha512-SpmVOVpdq0DJc0qArhF3E5xsxvaiqGNb73XfgBpK1y3UD5gs8DSo8aCTsuT5pX8rssdc2NDIzANwP9eCAiSdTA==", + "version": "0.3.24", + "resolved": "https://registry.npmjs.org/sockjs/-/sockjs-0.3.24.tgz", + "integrity": "sha512-GJgLTZ7vYb/JtPSSZ10hsOYIvEYsjbNU+zPdIHcUaWVNUEPivzxku31865sSSud0Da0W4lEeOPlmw93zLQchuQ==", "dev": true, "dependencies": { - "faye-websocket": "^0.10.0", - "uuid": "^3.4.0", - "websocket-driver": "0.6.5" + "faye-websocket": "^0.11.3", + "uuid": "^8.3.2", + "websocket-driver": "^0.7.4" } }, "node_modules/sockjs-client": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/sockjs-client/-/sockjs-client-1.4.0.tgz", - "integrity": "sha512-5zaLyO8/nri5cua0VtOrFXBPK1jbL4+1cebT/mmKA1E1ZXOvJrII75bPu0l0k843G/+iAbhEqzyKr0w/eCCj7g==", + "version": "1.6.1", + "resolved": "https://registry.npmjs.org/sockjs-client/-/sockjs-client-1.6.1.tgz", + "integrity": "sha512-2g0tjOR+fRs0amxENLi/q5TiJTqY+WXFOzb5UwXndlK6TO3U/mirZznpx6w34HVMoc3g7cY24yC/ZMIYnDlfkw==", "dev": true, "dependencies": { - "debug": "^3.2.5", - "eventsource": "^1.0.7", - "faye-websocket": "~0.11.1", - "inherits": "^2.0.3", - "json3": "^3.3.2", - "url-parse": "^1.4.3" + "debug": "^3.2.7", + "eventsource": "^2.0.2", + "faye-websocket": "^0.11.4", + "inherits": "^2.0.4", + "url-parse": "^1.5.10" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://tidelift.com/funding/github/npm/sockjs-client" } }, "node_modules/sockjs-client/node_modules/debug": { - "version": "3.2.6", - "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.6.tgz", - "integrity": "sha512-mel+jf7nrtEl5Pn1Qx46zARXKDpBbvzezse7p7LqINmdoIk8PYP5SySaxEmYv6TZ0JyEKA1hsCId6DIhgITtWQ==", + "version": "3.2.7", + "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.7.tgz", + "integrity": "sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==", "dev": true, "dependencies": { "ms": "^2.1.1" } }, - "node_modules/sockjs-client/node_modules/faye-websocket": { - "version": "0.11.3", - "resolved": "https://registry.npmjs.org/faye-websocket/-/faye-websocket-0.11.3.tgz", - "integrity": "sha512-D2y4bovYpzziGgbHYtGCMjlJM36vAl/y+xUyn1C+FVx8szd1E+86KwVw6XvYSzOP8iMpm1X0I4xJD+QtUb36OA==", + "node_modules/sockjs/node_modules/uuid": { + "version": "8.3.2", + "resolved": "https://registry.npmjs.org/uuid/-/uuid-8.3.2.tgz", + "integrity": "sha512-+NYs2QeMWy+GWFOEm9xnn6HCDp0l7QBD7ml8zLUmJ+93Q5NF0NocErnwkTkXVFNiX3/fpC6afS8Dhb/gz7R7eg==", "dev": true, - "dependencies": { - "websocket-driver": ">=0.5.1" - }, - "engines": { - "node": ">=0.8.0" + "bin": { + "uuid": "dist/bin/uuid" } }, "node_modules/source-list-map": { @@ -11916,12 +11906,12 @@ } }, "node_modules/webpack-dev-server": { - "version": "3.11.0", - "resolved": "https://registry.npmjs.org/webpack-dev-server/-/webpack-dev-server-3.11.0.tgz", - "integrity": "sha512-PUxZ+oSTxogFQgkTtFndEtJIPNmml7ExwufBZ9L2/Xyyd5PnOL5UreWe5ZT7IU25DSdykL9p1MLQzmLh2ljSeg==", + "version": "3.11.3", + "resolved": "https://registry.npmjs.org/webpack-dev-server/-/webpack-dev-server-3.11.3.tgz", + "integrity": "sha512-3x31rjbEQWKMNzacUZRE6wXvUFuGpH7vr0lIEbYpMAG9BOxi0928QU1BBswOAP3kg3H1O4hiS+sq4YyAn6ANnA==", "dev": true, "dependencies": { - "ansi-html": "0.0.7", + "ansi-html-community": "0.0.8", "bonjour": "^3.5.0", "chokidar": "^2.1.8", "compression": "^1.7.4", @@ -11941,11 +11931,11 @@ "p-retry": "^3.0.1", "portfinder": "^1.0.26", "schema-utils": "^1.0.0", - "selfsigned": "^1.10.7", + "selfsigned": "^1.10.8", "semver": "^6.3.0", "serve-index": "^1.9.1", - "sockjs": "0.3.20", - "sockjs-client": "1.4.0", + "sockjs": "^0.3.21", + "sockjs-client": "^1.5.0", "spdy": "^4.0.2", "strip-ansi": "^3.0.1", "supports-color": "^6.1.0", @@ -11960,6 +11950,14 @@ }, "engines": { "node": ">= 6.11.5" + }, + "peerDependencies": { + "webpack": "^4.0.0 || ^5.0.0" + }, + "peerDependenciesMeta": { + "webpack-cli": { + "optional": true + } } }, "node_modules/webpack-dev-server/node_modules/ansi-regex": { @@ -12204,15 +12202,17 @@ } }, "node_modules/websocket-driver": { - "version": "0.6.5", - "resolved": "https://registry.npmjs.org/websocket-driver/-/websocket-driver-0.6.5.tgz", - "integrity": "sha1-XLJVbOuF9Dc8bYI4qmkchFThOjY=", + "version": "0.7.4", + "resolved": "https://registry.npmjs.org/websocket-driver/-/websocket-driver-0.7.4.tgz", + "integrity": "sha512-b17KeDIQVjvb0ssuSDF2cYXSg2iztliJ4B9WdsuB6J952qCPKmnVq4DyW5motImXHDC1cBT/1UezrJVsKw5zjg==", "dev": true, "dependencies": { + "http-parser-js": ">=0.5.1", + "safe-buffer": ">=5.1.0", "websocket-extensions": ">=0.1.1" }, "engines": { - "node": ">=0.6.0" + "node": ">=0.8.0" } }, "node_modules/websocket-extensions": { @@ -13941,10 +13941,10 @@ "integrity": "sha512-hHUXGagefjN2iRrID63xckIvotOXOojhQKWIPUZ4mNUZ9nLZW+7FMNoE1lOkEhNWYsx/7ysGIuJYCiMAA9FnrA==", "dev": true }, - "ansi-html": { - "version": "0.0.7", - "resolved": "https://registry.npmjs.org/ansi-html/-/ansi-html-0.0.7.tgz", - "integrity": "sha1-gTWEAhliqenm/QOflA0S9WynhZ4=", + "ansi-html-community": { + "version": "0.0.8", + "resolved": "https://registry.npmjs.org/ansi-html-community/-/ansi-html-community-0.0.8.tgz", + "integrity": "sha512-1APHAyr3+PCamwNw3bXCPp4HFLONZt/yIH0sZp0/469KWNTEy+qN5jQ3GVX6DMZ1UXAi34yVwtTeaG/HpBuuzw==", "dev": true }, "ansi-regex": { @@ -16675,13 +16675,10 @@ "dev": true }, "eventsource": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/eventsource/-/eventsource-1.1.1.tgz", - "integrity": "sha512-qV5ZC0h7jYIAOhArFJgSfdyz6rALJyb270714o7ZtNnw2WSJ+eexhKtE0O8LYPRsHZHf2osHKZBxGPvm3kPkCA==", - "dev": true, - "requires": { - "original": "^1.0.0" - } + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/eventsource/-/eventsource-2.0.2.tgz", + "integrity": "sha512-IzUmBGPR3+oUG9dUeXynyNmf91/3zUSJg1lCktzKw47OXuhco54U3r9B7O4XX+Rb1Itm9OZ2b0RkTs10bICOxA==", + "dev": true }, "evp_bytestokey": { "version": "1.0.3", @@ -16972,9 +16969,9 @@ "dev": true }, "faye-websocket": { - "version": "0.10.0", - "resolved": "https://registry.npmjs.org/faye-websocket/-/faye-websocket-0.10.0.tgz", - "integrity": "sha1-TkkvjQTftviQA1B/btvy1QHnxvQ=", + "version": "0.11.4", + "resolved": "https://registry.npmjs.org/faye-websocket/-/faye-websocket-0.11.4.tgz", + "integrity": "sha512-CzbClwlXAuiRQAlUyfqPgvPoNKTckTPGfwZV4ZdAhVcP2lh9KUxJg2b5GkE7XbjKQ3YJnQ9z6D9ntLAlB+tP8g==", "dev": true, "requires": { "websocket-driver": ">=0.5.1" @@ -17650,6 +17647,12 @@ } } }, + "http-parser-js": { + "version": "0.5.8", + "resolved": "https://registry.npmjs.org/http-parser-js/-/http-parser-js-0.5.8.tgz", + "integrity": "sha512-SGeBX54F94Wgu5RH3X5jsDtf4eHyRogWX1XGT3b4HuW3tQPM4AaBzoUji/4AAJNXCEOWZ5O0DgZmJw1947gD5Q==", + "dev": true + }, "http-proxy": { "version": "1.18.1", "resolved": "https://registry.npmjs.org/http-proxy/-/http-proxy-1.18.1.tgz", @@ -18286,12 +18289,6 @@ "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==", "dev": true }, - "json3": { - "version": "3.3.3", - "resolved": "https://registry.npmjs.org/json3/-/json3-3.3.3.tgz", - "integrity": "sha512-c7/8mbUsKigAbLkD5B010BK4D9LZm7A1pNItkEwiUZRpIN66exu/e7YQWysGun+TRKaJp8MhemM+VkfWv42aCA==", - "dev": true - }, "json5": { "version": "2.1.3", "resolved": "https://registry.npmjs.org/json5/-/json5-2.1.3.tgz", @@ -19294,15 +19291,6 @@ "last-call-webpack-plugin": "^3.0.0" } }, - "original": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/original/-/original-1.0.2.tgz", - "integrity": "sha512-hyBVl6iqqUOJ8FqRe+l/gS8H+kKYjrEndd5Pm1MfBtsEKA038HkkdbAl/72EAXGyonD/PFsvmVG+EvcIpliMBg==", - "dev": true, - "requires": { - "url-parse": "^1.4.3" - } - }, "os-browserify": { "version": "0.3.0", "resolved": "https://registry.npmjs.org/os-browserify/-/os-browserify-0.3.0.tgz", @@ -21337,47 +21325,45 @@ } }, "sockjs": { - "version": "0.3.20", - "resolved": "https://registry.npmjs.org/sockjs/-/sockjs-0.3.20.tgz", - "integrity": "sha512-SpmVOVpdq0DJc0qArhF3E5xsxvaiqGNb73XfgBpK1y3UD5gs8DSo8aCTsuT5pX8rssdc2NDIzANwP9eCAiSdTA==", + "version": "0.3.24", + "resolved": "https://registry.npmjs.org/sockjs/-/sockjs-0.3.24.tgz", + "integrity": "sha512-GJgLTZ7vYb/JtPSSZ10hsOYIvEYsjbNU+zPdIHcUaWVNUEPivzxku31865sSSud0Da0W4lEeOPlmw93zLQchuQ==", "dev": true, "requires": { - "faye-websocket": "^0.10.0", - "uuid": "^3.4.0", - "websocket-driver": "0.6.5" + "faye-websocket": "^0.11.3", + "uuid": "^8.3.2", + "websocket-driver": "^0.7.4" + }, + "dependencies": { + "uuid": { + "version": "8.3.2", + "resolved": "https://registry.npmjs.org/uuid/-/uuid-8.3.2.tgz", + "integrity": "sha512-+NYs2QeMWy+GWFOEm9xnn6HCDp0l7QBD7ml8zLUmJ+93Q5NF0NocErnwkTkXVFNiX3/fpC6afS8Dhb/gz7R7eg==", + "dev": true + } } }, "sockjs-client": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/sockjs-client/-/sockjs-client-1.4.0.tgz", - "integrity": "sha512-5zaLyO8/nri5cua0VtOrFXBPK1jbL4+1cebT/mmKA1E1ZXOvJrII75bPu0l0k843G/+iAbhEqzyKr0w/eCCj7g==", + "version": "1.6.1", + "resolved": "https://registry.npmjs.org/sockjs-client/-/sockjs-client-1.6.1.tgz", + "integrity": "sha512-2g0tjOR+fRs0amxENLi/q5TiJTqY+WXFOzb5UwXndlK6TO3U/mirZznpx6w34HVMoc3g7cY24yC/ZMIYnDlfkw==", "dev": true, "requires": { - "debug": "^3.2.5", - "eventsource": "^1.0.7", - "faye-websocket": "~0.11.1", - "inherits": "^2.0.3", - "json3": "^3.3.2", - "url-parse": "^1.4.3" + "debug": "^3.2.7", + "eventsource": "^2.0.2", + "faye-websocket": "^0.11.4", + "inherits": "^2.0.4", + "url-parse": "^1.5.10" }, "dependencies": { "debug": { - "version": "3.2.6", - "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.6.tgz", - "integrity": "sha512-mel+jf7nrtEl5Pn1Qx46zARXKDpBbvzezse7p7LqINmdoIk8PYP5SySaxEmYv6TZ0JyEKA1hsCId6DIhgITtWQ==", + "version": "3.2.7", + "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.7.tgz", + "integrity": "sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==", "dev": true, "requires": { "ms": "^2.1.1" } - }, - "faye-websocket": { - "version": "0.11.3", - "resolved": "https://registry.npmjs.org/faye-websocket/-/faye-websocket-0.11.3.tgz", - "integrity": "sha512-D2y4bovYpzziGgbHYtGCMjlJM36vAl/y+xUyn1C+FVx8szd1E+86KwVw6XvYSzOP8iMpm1X0I4xJD+QtUb36OA==", - "dev": true, - "requires": { - "websocket-driver": ">=0.5.1" - } } } }, @@ -22753,12 +22739,12 @@ } }, "webpack-dev-server": { - "version": "3.11.0", - "resolved": "https://registry.npmjs.org/webpack-dev-server/-/webpack-dev-server-3.11.0.tgz", - "integrity": "sha512-PUxZ+oSTxogFQgkTtFndEtJIPNmml7ExwufBZ9L2/Xyyd5PnOL5UreWe5ZT7IU25DSdykL9p1MLQzmLh2ljSeg==", + "version": "3.11.3", + "resolved": "https://registry.npmjs.org/webpack-dev-server/-/webpack-dev-server-3.11.3.tgz", + "integrity": "sha512-3x31rjbEQWKMNzacUZRE6wXvUFuGpH7vr0lIEbYpMAG9BOxi0928QU1BBswOAP3kg3H1O4hiS+sq4YyAn6ANnA==", "dev": true, "requires": { - "ansi-html": "0.0.7", + "ansi-html-community": "0.0.8", "bonjour": "^3.5.0", "chokidar": "^2.1.8", "compression": "^1.7.4", @@ -22778,11 +22764,11 @@ "p-retry": "^3.0.1", "portfinder": "^1.0.26", "schema-utils": "^1.0.0", - "selfsigned": "^1.10.7", + "selfsigned": "^1.10.8", "semver": "^6.3.0", "serve-index": "^1.9.1", - "sockjs": "0.3.20", - "sockjs-client": "1.4.0", + "sockjs": "^0.3.21", + "sockjs-client": "^1.5.0", "spdy": "^4.0.2", "strip-ansi": "^3.0.1", "supports-color": "^6.1.0", @@ -22922,11 +22908,13 @@ } }, "websocket-driver": { - "version": "0.6.5", - "resolved": "https://registry.npmjs.org/websocket-driver/-/websocket-driver-0.6.5.tgz", - "integrity": "sha1-XLJVbOuF9Dc8bYI4qmkchFThOjY=", + "version": "0.7.4", + "resolved": "https://registry.npmjs.org/websocket-driver/-/websocket-driver-0.7.4.tgz", + "integrity": "sha512-b17KeDIQVjvb0ssuSDF2cYXSg2iztliJ4B9WdsuB6J952qCPKmnVq4DyW5motImXHDC1cBT/1UezrJVsKw5zjg==", "dev": true, "requires": { + "http-parser-js": ">=0.5.1", + "safe-buffer": ">=5.1.0", "websocket-extensions": ">=0.1.1" } }, From baa66a26381a9aaa918ef45d24c82e1d04a4fb3e Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Tue, 15 Nov 2022 11:31:27 -0700 Subject: [PATCH 097/280] Bump async from 2.6.3 to 2.6.4 (#4149) Bumps [async](https://github.com/caolan/async) from 2.6.3 to 2.6.4. - [Release notes](https://github.com/caolan/async/releases) - [Changelog](https://github.com/caolan/async/blob/v2.6.4/CHANGELOG.md) - [Commits](https://github.com/caolan/async/compare/v2.6.3...v2.6.4) --- updated-dependencies: - dependency-name: async dependency-type: indirect ... Signed-off-by: dependabot[bot] Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- package-lock.json | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/package-lock.json b/package-lock.json index ea68feae60..f220996cf1 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1668,9 +1668,9 @@ } }, "node_modules/async": { - "version": "2.6.3", - "resolved": "https://registry.npmjs.org/async/-/async-2.6.3.tgz", - "integrity": "sha512-zflvls11DCy+dQWzTW2dzuilv8Z5X/pjfmZOWba6TNIVDm+2UDaJmXSOXlasHKfNBs8oo3M0aT50fDEWfKZjXg==", + "version": "2.6.4", + "resolved": "https://registry.npmjs.org/async/-/async-2.6.4.tgz", + "integrity": "sha512-mzo5dfJYwAn29PeiJ0zvwTo04zj8HDJj0Mn8TD7sno7q12prdbnasKJHhkm2c1LgrhlJ0teaea8860oxi51mGA==", "dev": true, "dependencies": { "lodash": "^4.17.14" @@ -14109,9 +14109,9 @@ "dev": true }, "async": { - "version": "2.6.3", - "resolved": "https://registry.npmjs.org/async/-/async-2.6.3.tgz", - "integrity": "sha512-zflvls11DCy+dQWzTW2dzuilv8Z5X/pjfmZOWba6TNIVDm+2UDaJmXSOXlasHKfNBs8oo3M0aT50fDEWfKZjXg==", + "version": "2.6.4", + "resolved": "https://registry.npmjs.org/async/-/async-2.6.4.tgz", + "integrity": "sha512-mzo5dfJYwAn29PeiJ0zvwTo04zj8HDJj0Mn8TD7sno7q12prdbnasKJHhkm2c1LgrhlJ0teaea8860oxi51mGA==", "dev": true, "requires": { "lodash": "^4.17.14" From 1e266e30c9e4d4a99b0237baacbf91b15232aa12 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Tue, 15 Nov 2022 11:37:48 -0700 Subject: [PATCH 098/280] Bump is-svg and postcss-svgo (#4158) Removes [is-svg](https://github.com/sindresorhus/is-svg). It's no longer used after updating ancestor dependency [postcss-svgo](https://github.com/cssnano/cssnano). These dependencies need to be updated together. Removes `is-svg` Updates `postcss-svgo` from 4.0.2 to 4.0.3 - [Release notes](https://github.com/cssnano/cssnano/releases) - [Commits](https://github.com/cssnano/cssnano/compare/4.0.2...4.0.3) --- updated-dependencies: - dependency-name: is-svg dependency-type: indirect - dependency-name: postcss-svgo dependency-type: indirect ... Signed-off-by: dependabot[bot] Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- package-lock.json | 47 ++++++----------------------------------------- 1 file changed, 6 insertions(+), 41 deletions(-) diff --git a/package-lock.json b/package-lock.json index f220996cf1..fe8dd0e27e 100644 --- a/package-lock.json +++ b/package-lock.json @@ -5832,12 +5832,6 @@ "integrity": "sha1-wc56MWjIxmFAM6S194d/OyJfnDg=", "dev": true }, - "node_modules/html-comment-regex": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/html-comment-regex/-/html-comment-regex-1.1.2.tgz", - "integrity": "sha512-P+M65QY2JQ5Y0G9KKdlDpo0zK+/OHptU5AaBwUfAIDJZk1MYf32Frm84EcOytfJE0t5JvkAnKlmjsXDnWzCJmQ==", - "dev": true - }, "node_modules/html-entities": { "version": "1.3.1", "resolved": "https://registry.npmjs.org/html-entities/-/html-entities-1.3.1.tgz", @@ -6564,18 +6558,6 @@ "node": ">=0.10.0" } }, - "node_modules/is-svg": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/is-svg/-/is-svg-3.0.0.tgz", - "integrity": "sha512-gi4iHK53LR2ujhLVVj+37Ykh9GLqYHX6JOVXbLAucaG/Cqw9xwdFOjDM2qeifLs1sF1npXXFvDu0r5HNgCMrzQ==", - "dev": true, - "dependencies": { - "html-comment-regex": "^1.1.0" - }, - "engines": { - "node": ">=4" - } - }, "node_modules/is-symbol": { "version": "1.0.3", "resolved": "https://registry.npmjs.org/is-symbol/-/is-symbol-1.0.3.tgz", @@ -8953,12 +8935,11 @@ } }, "node_modules/postcss-svgo": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/postcss-svgo/-/postcss-svgo-4.0.2.tgz", - "integrity": "sha512-C6wyjo3VwFm0QgBy+Fu7gCYOkCmgmClghO+pjcxvrcBKtiKt0uCF+hvbMO1fyv5BMImRK90SMb+dwUnfbGd+jw==", + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/postcss-svgo/-/postcss-svgo-4.0.3.tgz", + "integrity": "sha512-NoRbrcMWTtUghzuKSoIm6XV+sJdvZ7GZSc3wdBN0W19FTtp2ko8NqLsgoh/m9CzNhU3KLPvQmjIwtaNFkaFTvw==", "dev": true, "dependencies": { - "is-svg": "^3.0.0", "postcss": "^7.0.0", "postcss-value-parser": "^3.0.0", "svgo": "^1.0.0" @@ -17572,12 +17553,6 @@ "integrity": "sha1-wc56MWjIxmFAM6S194d/OyJfnDg=", "dev": true }, - "html-comment-regex": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/html-comment-regex/-/html-comment-regex-1.1.2.tgz", - "integrity": "sha512-P+M65QY2JQ5Y0G9KKdlDpo0zK+/OHptU5AaBwUfAIDJZk1MYf32Frm84EcOytfJE0t5JvkAnKlmjsXDnWzCJmQ==", - "dev": true - }, "html-entities": { "version": "1.3.1", "resolved": "https://registry.npmjs.org/html-entities/-/html-entities-1.3.1.tgz", @@ -18172,15 +18147,6 @@ "integrity": "sha1-EtSj3U5o4Lec6428hBc66A2RykQ=", "dev": true }, - "is-svg": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/is-svg/-/is-svg-3.0.0.tgz", - "integrity": "sha512-gi4iHK53LR2ujhLVVj+37Ykh9GLqYHX6JOVXbLAucaG/Cqw9xwdFOjDM2qeifLs1sF1npXXFvDu0r5HNgCMrzQ==", - "dev": true, - "requires": { - "html-comment-regex": "^1.1.0" - } - }, "is-symbol": { "version": "1.0.3", "resolved": "https://registry.npmjs.org/is-symbol/-/is-symbol-1.0.3.tgz", @@ -20204,12 +20170,11 @@ } }, "postcss-svgo": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/postcss-svgo/-/postcss-svgo-4.0.2.tgz", - "integrity": "sha512-C6wyjo3VwFm0QgBy+Fu7gCYOkCmgmClghO+pjcxvrcBKtiKt0uCF+hvbMO1fyv5BMImRK90SMb+dwUnfbGd+jw==", + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/postcss-svgo/-/postcss-svgo-4.0.3.tgz", + "integrity": "sha512-NoRbrcMWTtUghzuKSoIm6XV+sJdvZ7GZSc3wdBN0W19FTtp2ko8NqLsgoh/m9CzNhU3KLPvQmjIwtaNFkaFTvw==", "dev": true, "requires": { - "is-svg": "^3.0.0", "postcss": "^7.0.0", "postcss-value-parser": "^3.0.0", "svgo": "^1.0.0" From 350247ece903737433dea319cfc9048914ab4875 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Tue, 15 Nov 2022 11:41:46 -0700 Subject: [PATCH 099/280] Bump axios and localtunnel (#4148) Bumps [axios](https://github.com/axios/axios) and [localtunnel](https://github.com/localtunnel/localtunnel). These dependencies needed to be updated together. Updates `axios` from 0.19.0 to 0.21.4 - [Release notes](https://github.com/axios/axios/releases) - [Changelog](https://github.com/axios/axios/blob/v0.21.4/CHANGELOG.md) - [Commits](https://github.com/axios/axios/compare/v0.19.0...v0.21.4) Updates `localtunnel` from 2.0.0 to 2.0.2 - [Release notes](https://github.com/localtunnel/localtunnel/releases) - [Changelog](https://github.com/localtunnel/localtunnel/blob/master/CHANGELOG.md) - [Commits](https://github.com/localtunnel/localtunnel/compare/v2.0.0...v2.0.2) --- updated-dependencies: - dependency-name: axios dependency-type: indirect - dependency-name: localtunnel dependency-type: indirect ... Signed-off-by: dependabot[bot] Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> From 12ab5cfd68e3809012345c11ec0a526679c984b8 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Tue, 15 Nov 2022 11:46:39 -0700 Subject: [PATCH 100/280] Bump ws from 6.2.1 to 6.2.2 (#4160) Bumps [ws](https://github.com/websockets/ws) from 6.2.1 to 6.2.2. - [Release notes](https://github.com/websockets/ws/releases) - [Commits](https://github.com/websockets/ws/compare/6.2.1...6.2.2) --- updated-dependencies: - dependency-name: ws dependency-type: indirect ... Signed-off-by: dependabot[bot] Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- package-lock.json | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/package-lock.json b/package-lock.json index fe8dd0e27e..edf88f6d20 100644 --- a/package-lock.json +++ b/package-lock.json @@ -12288,9 +12288,9 @@ "dev": true }, "node_modules/ws": { - "version": "6.2.1", - "resolved": "https://registry.npmjs.org/ws/-/ws-6.2.1.tgz", - "integrity": "sha512-GIyAXC2cB7LjvpgMt9EKS2ldqr0MTrORaleiOno6TweZ6r3TKtoFQWay/2PceJ3RuBasOHzXNn5Lrw1X0bEjqA==", + "version": "6.2.2", + "resolved": "https://registry.npmjs.org/ws/-/ws-6.2.2.tgz", + "integrity": "sha512-zmhltoSR8u1cnDsD43TX59mzoMZsLKqUweyYBAIvTngR3shc0W6aOZylZmq/7hqyVxPdi+5Ud2QInblgyE72fw==", "dev": true, "dependencies": { "async-limiter": "~1.0.0" @@ -22959,9 +22959,9 @@ "dev": true }, "ws": { - "version": "6.2.1", - "resolved": "https://registry.npmjs.org/ws/-/ws-6.2.1.tgz", - "integrity": "sha512-GIyAXC2cB7LjvpgMt9EKS2ldqr0MTrORaleiOno6TweZ6r3TKtoFQWay/2PceJ3RuBasOHzXNn5Lrw1X0bEjqA==", + "version": "6.2.2", + "resolved": "https://registry.npmjs.org/ws/-/ws-6.2.2.tgz", + "integrity": "sha512-zmhltoSR8u1cnDsD43TX59mzoMZsLKqUweyYBAIvTngR3shc0W6aOZylZmq/7hqyVxPdi+5Ud2QInblgyE72fw==", "dev": true, "requires": { "async-limiter": "~1.0.0" From 081e36e0564c972f336f85071b40b11c40dec0e5 Mon Sep 17 00:00:00 2001 From: mjaworskiccx <50406214+mjaworskiccx@users.noreply.github.com> Date: Tue, 15 Nov 2022 20:23:08 +0100 Subject: [PATCH 101/280] Clickonometrics: update (#4127) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit * add ccx params doc * Clickonometrics add gvl_id, update param name * Clickonometrics revert param name * Clickonometrics: add pbs, update description, media_types Co-authored-by: Piotr Koryśko --- dev-docs/bidders/ccx.md | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/dev-docs/bidders/ccx.md b/dev-docs/bidders/ccx.md index c830c93662..6902ca5b60 100644 --- a/dev-docs/bidders/ccx.md +++ b/dev-docs/bidders/ccx.md @@ -1,10 +1,11 @@ --- layout: bidder title: Clickonometrics -description: Prebid Clickonometrics Bidder Adaptor +description: Prebid Clickonometrics Bidder Adapter pbjs: true +pbs: true biddercode: ccx -media_types: video +media_types: banner, video gvl_id: 773 gdpr_supported: true --- From 82c83ee1acd99cb97d45775059ef3b10c4a2be25 Mon Sep 17 00:00:00 2001 From: Vladimir Fedoseev Date: Wed, 16 Nov 2022 15:59:02 +0100 Subject: [PATCH 102/280] VIS.X adapter update docs (#4134) Co-authored-by: Vladimir Fedoseev --- dev-docs/bidders/visx.md | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/dev-docs/bidders/visx.md b/dev-docs/bidders/visx.md index 53a833abf3..78fcd5c47e 100644 --- a/dev-docs/bidders/visx.md +++ b/dev-docs/bidders/visx.md @@ -7,7 +7,7 @@ gdpr_supported: true tcf2_supported: true gvl_id: 154 schain_supported: true -userIds: id5Id, unifiedId +userIds: all media_types: banner, video deals_supported: true pbjs: true @@ -87,7 +87,7 @@ pbjs.setConfig({ {: .table .table-bordered .table-striped } | Name | Scope | Description | Example | Type | |-------|----------|-------------------------------------|------------|----------| -| `uid` | required | The publisher's Ad unit ID in VIS.X. | `'903536'` | `string` | +| `uid` | required | The publisher's Ad unit ID in VIS.X. | `903536` | `integer` | ### Media type Banner object params @@ -118,7 +118,7 @@ var bannerAdUnit = { bids: [{ bidder: 'visx', params: { - uid: '903536' // required + uid: 903536 // required } }] }; @@ -139,7 +139,7 @@ var videoAdUnit = { bids: [{ bidder: 'visx', params: { - uid: '921068' // required + uid: 921068 // required } }] }; From ae4abed922ec510c83a33700d6fc1c434c77d7ac Mon Sep 17 00:00:00 2001 From: nitzanappush <116559356+nitzanappush@users.noreply.github.com> Date: Wed, 16 Nov 2022 19:58:43 +0200 Subject: [PATCH 103/280] New Adapter: Appush (#4103) * initial new Appush adapter * updates --- dev-docs/bidders/appush.md | 23 +++++++++++++++++++++++ 1 file changed, 23 insertions(+) create mode 100644 dev-docs/bidders/appush.md diff --git a/dev-docs/bidders/appush.md b/dev-docs/bidders/appush.md new file mode 100644 index 0000000000..33dcf05dd8 --- /dev/null +++ b/dev-docs/bidders/appush.md @@ -0,0 +1,23 @@ +--- +layout: bidder +title: Appush +description: Prebid Appush Bidder Adapter +biddercode: appush +media_types: banner, video, native +pbjs: false +pbs: true +gvl_id: 879 +safeframes_ok: true +floors_supported: true +fpd_supported: false +multiformat_supported: will-not-bid +ortb_blocking_supported: partial +--- + +### Prebid Server Params + +{: .table .table-bordered .table-striped } +| Name | Scope | Description | Example | Type | +|---------------|----------|-----------------------|-----------|-----------| +| `placementId` | optional | Placement Id | `'0'` | `'string'` | +| `endpointId` | optional | Endpoint Id | `'0'` | `'string'` | From 8859a8a54a82d3c8b2afd9282eaabb98197ea84d Mon Sep 17 00:00:00 2001 From: Yuriy Velichko Date: Thu, 17 Nov 2022 10:13:14 +0200 Subject: [PATCH 104/280] Prebid Mobile changes for the version `2.0.4` (#4135) * ios: update the AdMob integration guide * dummy change - need to test the account * new initializeSDK for iOS * Updates for Android AdMob integration * add description for checkGoogleMobileAdsCompatibility * update the dependency version * fix old typo * fix typo * request fix * request typos * Update android-sdk-integration-admob.md Co-authored-by: Yuriy Velichko Co-authored-by: Chris Huie Co-authored-by: MartianTribe --- .../android-sdk-integration-admob.md | 14 +-- .../rendering/android-sdk-integration.md | 2 +- .../rendering/ios-sdk-integration-admob.md | 102 ++---------------- .../android/code-integration-android.md | 19 +++- .../pbm-api/ios/code-integration-ios.md | 17 +++ 5 files changed, 53 insertions(+), 101 deletions(-) diff --git a/prebid-mobile/modules/rendering/android-sdk-integration-admob.md b/prebid-mobile/modules/rendering/android-sdk-integration-admob.md index 68af32f417..1e3e389e3b 100644 --- a/prebid-mobile/modules/rendering/android-sdk-integration-admob.md +++ b/prebid-mobile/modules/rendering/android-sdk-integration-admob.md @@ -93,7 +93,7 @@ bannerView?.adUnitId = adUnitId val extras = Bundle() val request = AdRequest .Builder() - .addCustomEventExtrasBundle(PrebidBannerAdapter::class.java, extras) + .addNetworkExtrasBundle(PrebidInterstitialAdapter::class.java, extras) .build() // 2. Create AdMobBannerMediationUtils @@ -134,9 +134,9 @@ The `MediationBannerAdUnit` is part of the prebid mediation API. This class is r The `fetchDemand` method makes a bid request to the prebid server and provides a result in a completion handler. -#### Step 5: Make an Ad Reuest +#### Step 5: Make an Ad Request -Now you should just make a regular AdMob's ad request. Evetything else will be handled by GMA SDK and prebid adapters. +Now you should just make a regular AdMob's ad request. Everything else will be handled by GMA SDK and prebid adapters. ## Interstitial API @@ -147,7 +147,7 @@ Integration example: val extras = Bundle() val request = AdRequest .Builder() - .addCustomEventExtrasBundle(PrebidInterstitialAdapter::class.java, extras) + .addNetworkExtrasBundle(PrebidInterstitialAdapter::class.java, extras) .build() // 2. Create AdMobInterstitialMediationUtils @@ -208,7 +208,7 @@ adUnit = MediationInterstitialAdUnit( The `fetchDemand` method makes a bid request to the prebid server and provides a result in a completion handler. -#### Step 5: Make an ad reuest +#### Step 5: Make an ad request Now you should just make a regular AdMob's ad request. Evetything else will be handled by GMA SDK and prebid adapters. @@ -277,7 +277,7 @@ The `MediationRewardedVideoAdUnit` is part of the prebid mediation API. This cla The `fetchDemand` method makes a bid request to the prebid server and provides a result in a completion handler. -#### Step 5: Make an ad reuest +#### Step 5: Make an ad request Now you should just make a regular AdMob's ad request. Evetything else will be handled by GMA SDK and prebid adapters. @@ -312,7 +312,7 @@ val adLoader = AdLoader val extras = Bundle() val adRequest = AdRequest .Builder() - .addCustomEventExtrasBundle(PrebidNativeAdapter::class.java, extras) + .addNetworkExtrasBundle(PrebidInterstitialAdapter::class.java, extras) .build() // 2. Create Native AdUnit diff --git a/prebid-mobile/modules/rendering/android-sdk-integration.md b/prebid-mobile/modules/rendering/android-sdk-integration.md index bc0573ad96..204f1d5f90 100644 --- a/prebid-mobile/modules/rendering/android-sdk-integration.md +++ b/prebid-mobile/modules/rendering/android-sdk-integration.md @@ -28,7 +28,7 @@ allprojects { dependencies { ... - implementation('org.prebid:prebid-mobile-sdk:2.0.0') + implementation('org.prebid:prebid-mobile-sdk:2.0.4') ... } ``` diff --git a/prebid-mobile/modules/rendering/ios-sdk-integration-admob.md b/prebid-mobile/modules/rendering/ios-sdk-integration-admob.md index e9b233a256..7445399275 100644 --- a/prebid-mobile/modules/rendering/ios-sdk-integration-admob.md +++ b/prebid-mobile/modules/rendering/ios-sdk-integration-admob.md @@ -11,14 +11,13 @@ The integration of Prebid Mobile with Google AdMob assumes that publisher has an See the [Google Integration Documentation](https://developers.google.com/admob/ios/quick-start) for the AdMob integration details. - {: .alert.alert-warning :} **Warning:** The `GADMobileAds.sharedInstance().start()` should be called in the adapters bundle, otherwise, GMA SDK won't load the ads with error: `adView:didFailToReceiveAdWithError: SDK tried to perform a networking task before being initialized.` To avoid the error add the following line to your app right after initialization of GMA SDK: ``` -GAMUtils.shared.initializeGAM() +AdMobUtils.initializeGAD() ``` Prebid is integrated into the AdMob monetization via adapters. @@ -77,17 +76,7 @@ prebidAdMobMediaitonAdUnit = MediationBannerAdUnit(configID: configID, // 4. Make a bid request prebidAdMobMediaitonAdUnit.fetchDemand { [weak self] result in - // 5. Store the winning bid in the GADRequest extras - // You must provide a winning bid via extras to the GADRequest here. - // Prebid SDK can't do it internally. - // Otherwise, the Prebid adapter won't be able to retrieve and render the winning bid. - let extras = GADCustomEventExtras() - extras.setExtras(self?.mediationDelegate.getEventExtras(), - forLabel: AdMobConstants.PrebidAdMobEventExtrasLabel) - - self?.gadRequest.register(extras) - - // 6. Make an ad request to AdMob + // 5. Make an ad request to AdMob self?.gadBanner.load(self?.gadRequest) } ``` @@ -109,24 +98,7 @@ The `MediationBannerAdUnit` is part of Prebid mediation API. This class is respo The `fetchDemand` method makes a bid request to prebid server and provides a result in a completion handler. -#### Step 5: Store the winning bid in the GADRequest extras - -GMA SDK doesn't provide extras to the adapter which were set not in the app scope. - -That is why you must add the code for dispatching the winning bid to the adapters. In the most cases you will just need to copy and paste the following lines inside the completion closure of the `fetchDemand()` method: - -``` -let extras = GADCustomEventExtras() - -extras.setExtras(self?.mediationDelegate.getEventExtras(), - forLabel: AdMobConstants.PrebidAdMobEventExtrasLabel) - -self?.gadRequest.register(extras) -``` -Everything -Make sure that you use the proper label for extras - `AdMobConstants.PrebidAdMobEventExtrasLabel`. Prebid adapters will extract the winnig bid by this key. - -#### Step 6: Make an Ad Reuest +#### Step 5: Make an Ad Request Now you should make a regular AdMob's ad request. Everything else will be handled by prebid adapters. @@ -148,17 +120,7 @@ admobAdUnit = MediationInterstitialAdUnit(configId: configID, // 4. Make a bid request admobAdUnit?.fetchDemand(completion: { [weak self]result in - // 5. Store the winning bid in the GADRequest extras - // You must provide a winning bid via extras to the GADRequest here. - // Prebid SDK can't do it internally. - // Otherwise, the Prebid adapter won't be able to retrieve and render the winning bid. - let extras = GADCustomEventExtras() - let prebidExtras = self?.mediationDelegate!.getEventExtras() - extras.setExtras(prebidExtras, forLabel: AdMobConstants.PrebidAdMobEventExtrasLabel) - - self?.gadRequest.register(extras) - - // 6. Make an ad request to AdMob + // 5. Make an ad request to AdMob GADInterstitialAd.load(withAdUnitID: adUnitID, request: self?.gadRequest) { [weak self] ad, error in guard let self = self else { return } if let error = error { @@ -166,7 +128,7 @@ admobAdUnit?.fetchDemand(completion: { [weak self]result in return } - // 7. Present the interstitial ad + // 6. Present the interstitial ad self.interstitial = ad self.interstitial?.fullScreenContentDelegate = self self.interstitial?.present(fromRootViewController: self) @@ -188,7 +150,6 @@ adUnit?.adFormats = [.display] ``` - #### Step 1: Create GADRequest This step is totally the same as for original [AdMob integration](https://developers.google.com/admob/ios/interstitial#swift). You don't have to make any modifications here. @@ -206,28 +167,11 @@ The `MediationInterstitialAdUnit` is part of the prebid mediation API. This clas The `fetchDemand` method makes a bid request to prebid server and provides a result in a completion handler. -#### Step 5: Store the winning bid in the GADRequest extras - -GMA SDK doesn't provide extras to the adapter which were set not in the app scope. - -That is why you must add the code for dispatching the winning bid to the adapters. In the most cases you will just need to copy and paste the following lines inside the completion closure of the `fetchDemand()` method: - - -``` -let extras = GADCustomEventExtras() -let prebidExtras = self?.mediationDelegate!.getEventExtras() -extras.setExtras(prebidExtras, forLabel: AdMobConstants.PrebidAdMobEventExtrasLabel) - -self?.gadRequest.register(extras) -``` - -Make sure that you use the proper label for extras - `AdMobConstants.PrebidAdMobEventExtrasLabel`. Prebid adapters will extract the winnig bid by this key. - -#### Step 6: Make an Ad Reuest +#### Step 5: Make an Ad Request Now you should make a regular AdMob's ad request. Everything else will be handled by GMA SDK and prebid adapters. -#### Steps 7: Display an ad +#### Steps 6: Display an ad Once you receive the ad it will be ready for display. Folow the [AdMob instructions](https://developers.google.com/admob/ios/interstitial#swift) about how to do it. @@ -277,7 +221,6 @@ To be notified when user earns a reward follow the [AdMob intructions](https://d This step is totally the same as for original [AdMob integration](https://developers.google.com/admob/ios/rewarded). You don't have to make any modifications here. - #### Step 2: Create MediationRewardedAdUnit The `AdMobMediationRewardedUtils` is a helper class, wich performs certain utilty work for the `MediationRewardedAdUnit`, like passing the targeting keywords to the adapters. @@ -290,7 +233,7 @@ The `MediationRewardedAdUnit` is part of the prebid mediation API. This class is The `fetchDemand` method makes a bid request to the prebid server and provides a result in a completion handler. -#### Step 5: Make an Ad Reuest +#### Step 5: Make an Ad Request Now you should make a regular AdMob's ad request. Everything else will be handled by GMA SDK and prebid adapters. @@ -328,19 +271,10 @@ nativeAdUnit.addNativeAssets(nativeAssets) // 5. Set up event tracker for bid request nativeAdUnit.addEventTracker(eventTrackers) -// 5. Make a bid request +// 6. Make a bid request nativeAdUnit.fetchDemand { [weak self] result in guard let self = self else { return } - // 6. Store the winning bid in the GADRequest extras - // You must provide a winning bid via extras to the GADRequest here. - // Prebid SDK can't do it internally. - // Otherwise, the Prebid adapter won't be able to retrieve and render the winning bid - let extras = GADCustomEventExtras() - let prebidExtras = self.mediationDelegate?.getEventExtras() - extras.setExtras(prebidExtras, forLabel: AdMobConstants.PrebidAdMobEventExtrasLabel) - self.gadRequest.register(extras) - // 7. Load AdMob Native ad self.adLoader = GADAdLoader(adUnitID: self.adMobAdUnitId!, rootViewController: self.rootController, @@ -349,7 +283,6 @@ nativeAdUnit.fetchDemand { [weak self] result in self.adLoader?.delegate = self - // 8. Make an ad request self.adLoader?.load(self.gadRequest) } ``` @@ -407,22 +340,7 @@ let eventTrackers = [ The `fetchDemand` method makes a bid request to prebid server and provides a result in a completion handler. -#### Step 7: Store the winning bid in the GADRequest extras - -GMA SDK doesn't provide extras to the adapter if they were set not in the app scope. - -That is why you must add the code for dispatching the winning bid to the adapters. In the most cases you will just need to copy and paste the following lines inside the completion closure of the `fetchDemand()` method: - -``` -let extras = GADCustomEventExtras() -let prebidExtras = self?.mediationDelegate!.getEventExtras() -extras.setExtras(prebidExtras, forLabel: AdMobConstants.PrebidAdMobEventExtrasLabel) - -self?.gadRequest.register(extras) -``` - -Make sure that you use the proper label for extras - `AdMobConstants.PrebidAdMobEventExtrasLabel`. Prebid adapters will extract the winnig bid by this key. -#### Step 8: Load AdMob Native ad +#### Step 7: Load AdMob Native ad Now just load a native ad from AdMob according to the [AdMob instructions](https://developers.google.com/admob/ios/native/start). diff --git a/prebid-mobile/pbm-api/android/code-integration-android.md b/prebid-mobile/pbm-api/android/code-integration-android.md index 50ea7bb9a0..1b618a5971 100644 --- a/prebid-mobile/pbm-api/android/code-integration-android.md +++ b/prebid-mobile/pbm-api/android/code-integration-android.md @@ -19,7 +19,7 @@ If you are not familar with using Maven for build management visit the [Maven we To include the Prebid Mobile SDK simply add this line to your gradle dependencies to get the lastest stable release: ``` -implementation 'org.prebid:prebid-mobile-sdk:1.12.2' +implementation 'org.prebid:prebid-mobile-sdk:2.0.4' ``` {% capture warning_note %} @@ -54,6 +54,23 @@ Integrating **Google** with your application Go to Google's developer site and follow the instructions for integrating their [Mobile Ads SDK](https://developers.google.com/ad-manager/mobile-ads-sdk/android/quick-start) into your app. +### Initialize SDK + +Call the following method at the start of the app: + +``` +PrebidMobile.initializeSdk(requireContext(), null) +``` + +If you integrate Prebid SDK with GMA SDK using Original API, add the following check right after initialization. It will help to monitor the compatibility of the Prebid and Google SDKs and avoid silent loosing of revenue. + +``` +PrebidMobile.checkGoogleMobileAdsCompatibility() +``` + +Check the logs, and if there is no warning message, then SDKs are compatible. + + ### Set Targeting Parameters (Optional) Targeting parameters enable you to define the target audience for the bid request. Prebid Mobile supports the following global targeting parameters. These targeting parameters are set only once and apply to all Prebid Mobile ad units. They do not change for a given user session. diff --git a/prebid-mobile/pbm-api/ios/code-integration-ios.md b/prebid-mobile/pbm-api/ios/code-integration-ios.md index 1452d32a5c..710ba1b890 100644 --- a/prebid-mobile/pbm-api/ios/code-integration-ios.md +++ b/prebid-mobile/pbm-api/ios/code-integration-ios.md @@ -123,6 +123,23 @@ If you have opted to host your own Prebid Server solution you will need to store Prebid.shared.setCustomPrebidServer(url:URL_STRING_TO_SERVER) ``` +### Initialize Prebid SDK + +To start Prebid SDK use the following method: + +``` +Prebid.initializeSDK() +``` + +If you integrate Prebid Mobile with GMA SDK, use the following initializer, wich checks the compatibility of Prebid SDK with GMA SDK used in the app: + + +``` +Prebid.initializeSDK(GADMobileAds.sharedInstance()) +``` + +Check the log messages of the app. If the provided GMA SDK version is not verified for compatibility, the Prebid SDK informs about it. + ### Integrate Ad Servers With Your App From 15a86cf91668e31bce9c2913e9a1070b7c3d63c6 Mon Sep 17 00:00:00 2001 From: azuryo <108641852+azuryo@users.noreply.github.com> Date: Thu, 17 Nov 2022 22:37:45 +0900 Subject: [PATCH 105/280] Microad Bid Adapter: Support for User Ids (#4141) --- dev-docs/bidders/microad.md | 19 +++++++++++-------- 1 file changed, 11 insertions(+), 8 deletions(-) diff --git a/dev-docs/bidders/microad.md b/dev-docs/bidders/microad.md index 09f710565b..88a7d19c9d 100644 --- a/dev-docs/bidders/microad.md +++ b/dev-docs/bidders/microad.md @@ -5,6 +5,7 @@ description: Prebid MicroAd SSP Bidder Adaptor pbjs: true biddercode: microad media_types: banner +userIds: imuid, id5Id, tdid, novatiq, parrableId, dacId, identityLink, criteo, pubcid, uid2 --- Note: @@ -14,11 +15,13 @@ For more information, visit [MicroAd website](https://www.microad.co.jp/contact/ ### Bid parameters {: .table .table-bordered .table-striped } -| Name | Scope | Description | Example | Type | -|------------|----------|---------------------------------------------------------------|--------------------------------------|----------| -| `spot` | required | Ad placement ID provided by MicroAd. | `'209e56872ae8b0442a60477ae0c58be9'` | `string` | -| `url` | optional | URL parameter. Effective only when provided by MicroAd. | `'${COMPASS_EXT_URL}'` | `string` | -| `referrer` | optional | Referrer parameter. Effective only when provided by MicroAd. | `'${COMPASS_EXT_REF}'` | `string` | -| `ifa` | optional | IFA parameter. Effective only when provided by MicroAd. | `'${COMPASS_EXT_IFA}'` | `string` | -| `appid` | optional | App ID parameter. Effective only when provided by MicroAd. | `'${COMPASS_EXT_APPID}'` | `string` | -| `geo` | optional | Geo parameter. Effective only when provided by MicroAd. | `'${COMPASS_EXT_GEO}'` | `string` | +| Name | Scope | Description | Example | Type | +|------------|----------|-------------------------------------------------------------------|--------------------------------------|-----------------| +| `spot` | required | Ad placement ID provided by MicroAd. | `'209e56872ae8b0442a60477ae0c58be9'` | `string` | +| `url` | optional | URL parameter. Effective only when provided by MicroAd. | `'${COMPASS_EXT_URL}'` | `string` | +| `referrer` | optional | Referrer parameter. Effective only when provided by MicroAd. | `'${COMPASS_EXT_REF}'` | `string` | +| `ifa` | optional | IFA parameter. Effective only when provided by MicroAd. | `'${COMPASS_EXT_IFA}'` | `string` | +| `appid` | optional | App ID parameter. Effective only when provided by MicroAd. | `'${COMPASS_EXT_APPID}'` | `string` | +| `geo` | optional | Geo parameter. Effective only when provided by MicroAd. | `'${COMPASS_EXT_GEO}'` | `string` | +| `aids` | optional | User IDs parameter. `type` indicates User IDs type. | `[{type: 6, id: '*******'}]` | `Array` | + From 1403b7b6b33371a5d997b9f115837e8d28eb8e74 Mon Sep 17 00:00:00 2001 From: Aaron Price <67345931+AaronColbyPrice@users.noreply.github.com> Date: Thu, 17 Nov 2022 05:38:29 -0800 Subject: [PATCH 106/280] eps_update_branding - updating Conversant branding to Epsilon (#4131) --- _data/partners.yml | 10 +++++----- assets/images/partners/tech/conversant_logo.png | Bin 4798 -> 0 bytes assets/images/partners/tech/epsilon_logo.png | Bin 0 -> 3634 bytes deprecated/old_index_md_content.html | 2 +- dev-docs/analytics/{conversant.md => epsilon.md} | 10 +++++----- dev-docs/bidders/{conversant.md => epsilon.md} | 8 ++++---- .../endpoints/openrtb2/pbs-endpoint-video.md | 2 +- 7 files changed, 16 insertions(+), 16 deletions(-) delete mode 100644 assets/images/partners/tech/conversant_logo.png create mode 100644 assets/images/partners/tech/epsilon_logo.png rename dev-docs/analytics/{conversant.md => epsilon.md} (82%) rename dev-docs/bidders/{conversant.md => epsilon.md} (92%) diff --git a/_data/partners.yml b/_data/partners.yml index 5aae2d17c1..e8e676c8bf 100644 --- a/_data/partners.yml +++ b/_data/partners.yml @@ -43,11 +43,6 @@ imgURL: /assets/images/partners/tech/beachfront_logo.png type: technology -- company: Conversant - link: https://www.conversantmedia.com/ - imgURL: /assets/images/partners/tech/conversant_logo.png - type: technology - - company: Criteo link: https://www.criteo.com/for-publishers/products/criteo-direct-bidder/ imgURL: /assets/images/partners/tech/criteo.png @@ -58,6 +53,11 @@ imgURL: /assets/images/partners/tech/datablocks_logo.png type: technology +- company: Epsilon + link: https://www.epsilon.com/ + imgURL: /assets/images/partners/tech/epsilon_logo.png + type: technology + - company: LiveRamp link: https://liveramp.com/ imgURL: /assets/images/partners/tech/LiveRamp-Logo.png diff --git a/assets/images/partners/tech/conversant_logo.png b/assets/images/partners/tech/conversant_logo.png deleted file mode 100644 index 419c51ffb4a46313354efc3c854f76456519ff26..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 4798 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 Y0evy^Lz(mrv;Y7A07*qoM6N<$f{)JdFaQ7m diff --git a/assets/images/partners/tech/epsilon_logo.png b/assets/images/partners/tech/epsilon_logo.png new file mode 100644 index 0000000000000000000000000000000000000000..45667e1bc2b6fe26fdf76b9c578eb1b970d32e64 GIT binary patch literal 3634 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 Ef{og|H2?qr literal 0 HcmV?d00001 diff --git a/deprecated/old_index_md_content.html b/deprecated/old_index_md_content.html index a2552234c5..cfe3a01a2d 100644 --- a/deprecated/old_index_md_content.html +++ b/deprecated/old_index_md_content.html @@ -93,7 +93,7 @@

Partners that work with Prebid

SmartyAds

Meme Global

Underdog Media

-

Conversant

+

Epsilon

Adblade

Piximedia

GetIntent

diff --git a/dev-docs/analytics/conversant.md b/dev-docs/analytics/epsilon.md similarity index 82% rename from dev-docs/analytics/conversant.md rename to dev-docs/analytics/epsilon.md index e0c7712d8e..91b233ba3f 100644 --- a/dev-docs/analytics/conversant.md +++ b/dev-docs/analytics/epsilon.md @@ -1,7 +1,7 @@ --- layout: analytics -title: Conversant -description: Conversant Prebid Analytics Adapter +title: Epsilon +description: Epsilon Prebid Analytics Adapter (formerly Conversant) modulecode: conversant gdpr_supported: true usp_supported: true @@ -13,8 +13,8 @@ enable_download: true #### Registration -Conversant (Epsilon) analytics adapter requires approval from the -Conversant team, even for existing accounts. Please reach out to +Epsilon (formerly Conversant) analytics adapter requires approval from the +Epsilon team, even for existing accounts. Please reach out to publishersupport@epsilon.com for more information. #### Analytics Options @@ -22,7 +22,7 @@ publishersupport@epsilon.com for more information. {: .table .table-bordered .table-striped } | Name | Scope | Description | Example | Type | |-------------|---------|--------------------|-----------------------------------------------------------------------------------------------------------------------------|-------------------------------------------------------------------------------------|------------------| -| site_id | required | Conversant (Epsilon) site id for the site that will track prebid usage. | 1234 | integer | +| site_id | required | Epsilon site id for the site that will track prebid usage. | 1234 | integer | | cnvr_sampling | optional | Sample rate for analytics data. Value should be between 0 and 1 (inclusive), 0 == never sample, 1 == always sample, 0.5 == send analytics 50% of the time. | 0.5 | float | ### Example Configuration diff --git a/dev-docs/bidders/conversant.md b/dev-docs/bidders/epsilon.md similarity index 92% rename from dev-docs/bidders/conversant.md rename to dev-docs/bidders/epsilon.md index 4298219be0..602cd0506e 100644 --- a/dev-docs/bidders/conversant.md +++ b/dev-docs/bidders/epsilon.md @@ -1,7 +1,7 @@ --- layout: bidder -title: Conversant -description: Prebid Conversant Bidder Adaptor +title: Epsilon +description: Epsilon Prebid Bidder Adaptor (formerly Conversant) pbjs: true pbs: true biddercode: conversant @@ -21,12 +21,12 @@ gvl_id: 24 | Name | Scope | Description | Example | Type | |---------------|-----------------------------|---------------------------------------------------------------------------------------------------------------------------|-------------------|------------------| -| `site_id` | optional | The site ID from Conversant. | `'87293'` | `string` | +| `site_id` | required | The site ID from Epsilon. | `'87293'` | `string` | | `secure` | required (for secure pages) | If impression requires secure HTTPS URL creative assets and markup. 0 for non-secure, 1 for secure. Default is non-secure | `1` | `integer` | | `bidfloor` | optional | Bid floor | `0.50` | `float` | | `tag_id` | optional | Identifies specific ad placement. | `'cnvr-test-tag'` | `string` | | `white_label_url`| optional | Override the destination URL the request is sent to. | `'https://mydomain.com/hbendpoint'` | `string` | -| `pubcid_name` | optional | Name of the pub common id. Conversant adapter can read the id directly if the UserID module is absent. Default is _pubcid.| `'_pubcid'` | `string` | +| `pubcid_name` | optional | Name of the pub common id. Epsilon adapter can read the id directly if the UserID module is absent. Default is _pubcid.| `'_pubcid'` | `string` | ### Video Params diff --git a/prebid-server/endpoints/openrtb2/pbs-endpoint-video.md b/prebid-server/endpoints/openrtb2/pbs-endpoint-video.md index c8eb75a9cc..a0f68616af 100644 --- a/prebid-server/endpoints/openrtb2/pbs-endpoint-video.md +++ b/prebid-server/endpoints/openrtb2/pbs-endpoint-video.md @@ -173,8 +173,8 @@ These are the supported (registered) bidder names. - "audienceNetwork" - "beachfront" - "brightroll" -- "conversant" - "eplanning" +- "epsilon" - "grid" - "gumgum" - "ix" From 935d6dcc438c0f9a589cbbc81628301fe44dc2e8 Mon Sep 17 00:00:00 2001 From: dalmenarDevST <116064809+dalmenarDevST@users.noreply.github.com> Date: Thu, 17 Nov 2022 14:39:40 +0100 Subject: [PATCH 107/280] Seedtag adapter - Add coppa (#4128) * added media_types to the seedtag docs * Updating doc to include inArticle * Adding again pbjs param. * add coppa param Co-authored-by: Carlos Barreiro Mata Co-authored-by: Laura Morillo-Velarde --- dev-docs/bidders/seedtag.md | 1 + 1 file changed, 1 insertion(+) diff --git a/dev-docs/bidders/seedtag.md b/dev-docs/bidders/seedtag.md index 39a16e7060..03d7dffc0b 100644 --- a/dev-docs/bidders/seedtag.md +++ b/dev-docs/bidders/seedtag.md @@ -9,6 +9,7 @@ schain_supported: true gvl_id: 157 media_types: banner, video biddercode: seedtag +coppa_supported: true --- ### Note From f4f5d482fd992dd267080e3e9a1ef571d00d313d Mon Sep 17 00:00:00 2001 From: bretg Date: Thu, 17 Nov 2022 08:57:22 -0500 Subject: [PATCH 108/280] pbs-go dev alias instructions (#4087) --- prebid-server/developers/add-new-bidder-go.md | 15 +++++++++++++++ 1 file changed, 15 insertions(+) diff --git a/prebid-server/developers/add-new-bidder-go.md b/prebid-server/developers/add-new-bidder-go.md index f0f745995b..a25025db14 100644 --- a/prebid-server/developers/add-new-bidder-go.md +++ b/prebid-server/developers/add-new-bidder-go.md @@ -920,6 +920,21 @@ You need to provide default settings for your bid adapter. You can decide if you {: .alert.alert-warning :} **HOST SPECIFIC INFO:** The default endpoint must not be specific to any particular host, such as Xandr/AppNexus. We may ask you about suspicious looking ids during the review process. Please reach out to individual hosts if you need to set specialized configuration. +## Aliasing an Adapter + +If your bidding endpoint can support more than one biddercode, you shouldn't replicate +the whole adapter codebase. Rather, follow these steps to create a 'hardcoded' alias: + +1. Create a config yaml file in static/bidder-info - e.g. static/bidder-info/myalias.yaml +1. Copy the “source” bidder json schema and place it in the static/bidder-params directory - e.g. static/bidder-params/myalias.json +1. Add the new alias to the openrtb_ext/bidders.go file -- e.g. BidderMyAlias BidderName = "myalias" +1. Map the alias to the adapter in exchange/adapter_builders.go . e.g. openrtb_ext.BidderMyAlias: myMain.Builder +1. Test: build the server locally and try sending a request with the alias as a bidder. + +Notes: +- The alias name must be unique for the first 6 chars as noted above for biddercodes. +- This process will be simplified someday. + ## Test Your Adapter This section will guide you through the creation of automated unit tests to cover your bid adapter code and bidder parameters JSON Schema. We use GitHub Action Workflows to ensure the code you submit passes validation. You can run the same validation locally with this command: From 19a427d0de53c345e7b94f2d1d46e83f1c96b0e2 Mon Sep 17 00:00:00 2001 From: product-aax <103228925+product-aax@users.noreply.github.com> Date: Thu, 17 Nov 2022 21:29:12 +0530 Subject: [PATCH 109/280] Added medianet alias code (#4116) --- dev-docs/bidders/aax.md | 1 + 1 file changed, 1 insertion(+) diff --git a/dev-docs/bidders/aax.md b/dev-docs/bidders/aax.md index 5ba57a45b1..b5f0398797 100644 --- a/dev-docs/bidders/aax.md +++ b/dev-docs/bidders/aax.md @@ -3,6 +3,7 @@ layout: bidder title: AAX description: Prebid Aax Bidder Adaptor biddercode: aax +aliasCode : medianet gdpr_supported: true media_types: banner,native,video usp_supported: true From 3a09018ff4252aab442f4a9618e2be31ff6ac54a Mon Sep 17 00:00:00 2001 From: rimaburder-index <55195208+rimaburder-index@users.noreply.github.com> Date: Tue, 22 Nov 2022 10:50:42 -0500 Subject: [PATCH 110/280] Updated Video (instream) example and formatting (#4159) --- dev-docs/bidders/ix.md | 71 ++++++++++++++++-------------------------- 1 file changed, 27 insertions(+), 44 deletions(-) diff --git a/dev-docs/bidders/ix.md b/dev-docs/bidders/ix.md index 480c84db8a..6a6462559e 100644 --- a/dev-docs/bidders/ix.md +++ b/dev-docs/bidders/ix.md @@ -99,33 +99,29 @@ In this configuration Prebid.js calls Index directly from the browser using our 3. Define your ad units in the `adUnit` object. This includes the details about the ad slots such as the media types, ad size, and ad code. For more information about this object, see Prebid's [Ad Unit Reference](https://docs.prebid.org/dev-docs/adunit-reference.html) documentation. 4. Enable user syncing by adding the following code in the [pbjs.setConfig()](https://docs.prebid.org/dev-docs/publisher-api-reference/setConfig.html) function. Index strongly recommends enabling user syncing through iFrames, though we do also support image-based syncing. This functionality improves DSP user match rates and increases the Index bid rate and bid price. Make sure to call `pbjs.setConfig()` only once. This configuration is optional in Prebid, but required by Index.
- **Example:** ```javascript -pbjs.setConfig({ - userSync: { - iframeEnabled: true, - filterSettings: { - iframe: { - bidders: ['ix'], - filter: 'include' + pbjs.setConfig({ + userSync: { + iframeEnabled: true, + filterSettings: { + iframe: { + bidders: ['ix'], + filter: 'include' + } } } - } -}); + }); ``` - - 5. (Optional) Set up First Party Data (FPD) using the Index bidder-specific FPD (preferred method) setting or the Prebid FPD module. For more information, see the [Set up First Party Data (FPD)](#set-up-first-party-data-fpd) section below. 6. (Optional) If you want to monetize instream video, you need to enable a cache endpoint in the [pbjs.setConfig()](https://docs.prebid.org/dev-docs/publisher-api-reference/setConfig.html) function as follows:
```javascript -pbjs.setConfig({ - cache: { - url: 'https://prebid.adnxs.com/pbc/v1/cache' - } -}); + pbjs.setConfig({ + cache: { + url: 'https://prebid.adnxs.com/pbc/v1/cache' + } + }); ``` - 7. (Optional) If you want to monetize outstream video, you can choose among the following options. Outstream video is available from Prebid.js version 6.25 or higher. * Use Index’s outstream video player. For more information, see the [Index's outstream video player ](#indexs-outstream-video-player)section below. * Use your own outstream video player. For more information, see [Prebid's documentation on how to show video ads.](https://docs.prebid.org/dev-docs/show-outstream-video-ads.html) @@ -142,40 +138,32 @@ In this configuration, Prebid.js makes a call to Prebid Server and then Prebid S adapters.ix.enabled=true adapters.ix.endpoint=http:// ``` - - 2. In the `[pbjs.setConfig()]` function, within the `s2sConfig` property, add `ix` to the `bidders` attribute. 3. Define the Index-specific parameters at the bidder level. For Index's bidder-specific parameters, see the [Bid request parameters](#bid-request-parameters) section below. 4. Define your ad units in the `adUnit` object. For more information about this object, see Prebid's [Ad Unit Reference](https://docs.prebid.org/dev-docs/adunit-reference.html) documentation. 5. Enable user syncing by adding the following code in the [pbjs.setConfig()](https://docs.prebid.org/dev-docs/publisher-api-reference/setConfig.html) function. Index strongly recommends enabling user syncing through iFrames, though we do also support image-based syncing. This functionality improves DSP user match rates and increases the Index bid rate and bid price. Be sure to call `pbjs.setConfig()` only once. This configuration is optional in Prebid, but required by Index.
- ```javascript -pbjs.setConfig({ - userSync: { - iframeEnabled: true, - filterSettings: { - iframe: { + pbjs.setConfig({ + userSync: { + iframeEnabled: true, + filterSettings: { + iframe: { bidders: ['ix'], filter: 'include' + } } } - } - }); + }); ``` - - 6. (Optional) Set up First Party Data (FPD) using the Index bidder-specific FPD (preferred method) setting or the Prebid FPD module. For more information, see the [Set up First Party Data (FPD)](#set-up-first-party-data-fpd) section below. 7. (Optional) If you want to monetize instream video, you need to enable a cache endpoint in the `[pbjs.setConfig()]` function as follows: ```javascript -pbjs.setConfig({ - cache: { - url: 'https://prebid.adnxs.com/pbc/v1/cache' - } -}); + pbjs.setConfig({ + cache: { + url: 'https://prebid.adnxs.com/pbc/v1/cache' + } + }); ``` - - - 8. (Optional) If you want to monetize outstream video, you can choose among the following options. Outstream video is available from Prebid.js version 6.25 or higher. * Use Index's outstream video player. For more information, see the [Index's outstream video player ](#indexs-outstream-video-player) section below. * Use your own outstream video player. For more information, see [Prebid’s documentation on how to show video ads.](https://docs.prebid.org/dev-docs/show-outstream-video-ads.html) @@ -467,11 +455,6 @@ var adUnits = [{ } }, bids: [{ - bidder: 'ix', - params: { - siteId: '12345' - } - }, { bidder: 'ix', params: { siteId: '12345', @@ -619,4 +602,4 @@ var adUnits = [{ ] }]; -``` \ No newline at end of file +``` From a54cc1b72a4afa8f4e2ac593e76e3eadfa669697 Mon Sep 17 00:00:00 2001 From: Wiem Zine El Abidine Date: Tue, 22 Nov 2022 17:08:46 +0100 Subject: [PATCH 111/280] Remove the example of the minimal version of Live Connect (#4165) * remove description of minimal version * remove the second way * small adjustment --- dev-docs/modules/userId.md | 8 +------- 1 file changed, 1 insertion(+), 7 deletions(-) diff --git a/dev-docs/modules/userId.md b/dev-docs/modules/userId.md index e29d7dcd44..4fe7dbfa9b 100644 --- a/dev-docs/modules/userId.md +++ b/dev-docs/modules/userId.md @@ -1237,18 +1237,12 @@ The Kinesso ID privacy policy is covered under the [Kinesso Privacy Notice](http LiveIntent offers audience resolution by leveraging our next-generation identity solutions. The LiveIntent identity graph is built around a people-based set of data that is authenticated daily through active engagements with email newsletters and media across the web. The LiveIntent nonID is a user identifier tied to an active, encrypted email in our graph and functions in cookie-challenged environments and browsers. -There are two ways to build your Prebid.js package to include the LiveIntent nonID: -* The standard version which allows publishers to include the module with full functionalities, like hashing email addresses and identity resolution -* The minimal version, which allows publishers to deploy a smaller bundle with minimal features, including identity resolution. +Build your Prebid.js package to include the LiveIntent nonID using the standard version which allows publishers to include the module with full functionalities, like hashing email addresses and identity resolution. Add the **full** LiveIntent Identity module to your Prebid.js package with: {: .alert.alert-info :} gulp build --modules=userId,liveIntentIdSystem -Add the **minimal** LiveIntent Identity module to your Prebid.js package with: -{: .alert.alert-info :} -LiveConnectMode=minimal gulp build --modules=liveIntentIdSystem - The `request.userId.lipb` object would look like: ``` { From 4e681d2d73e89d6a1f968705859e0991d65fe9c6 Mon Sep 17 00:00:00 2001 From: bretg Date: Tue, 22 Nov 2022 11:09:20 -0500 Subject: [PATCH 112/280] updated image to iframe in overview page (#4166) * updated image to iframe in overview page * Update intro.md updated the logo to width of new image to right-justify it. Co-authored-by: Jean Stemp <38964447+jeanstemp@users.noreply.github.com> --- overview/intro.md | 10 ++++++++-- 1 file changed, 8 insertions(+), 2 deletions(-) diff --git a/overview/intro.md b/overview/intro.md index 62147db0ce..e4c3a2444d 100644 --- a/overview/intro.md +++ b/overview/intro.md @@ -20,9 +20,15 @@ If you’re looking for a marketing-level overview of the Prebid software and or The Prebid.org suite of products leads the industry in providing header bidding to publishers. -![Top Header Bidding Providers](/assets/images/intros/top-header-providers.png) + -
+

Data by Sincera

From 2ad2c2e5c331f9140ed41470bd4a3fe30e00c32a Mon Sep 17 00:00:00 2001 From: bretg Date: Tue, 22 Nov 2022 11:11:30 -0500 Subject: [PATCH 113/280] Delete top-header-providers.png (#4171) --- assets/images/intros/top-header-providers.png | Bin 63466 -> 0 bytes 1 file changed, 0 insertions(+), 0 deletions(-) delete mode 100644 assets/images/intros/top-header-providers.png diff --git a/assets/images/intros/top-header-providers.png b/assets/images/intros/top-header-providers.png deleted file mode 100644 index 1fe0ace9e2c9b6d0b61827096decfd8985bd6039..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 63466 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 Date: Tue, 22 Nov 2022 11:12:44 -0500 Subject: [PATCH 114/280] Bump engine.io from 6.2.0 to 6.2.1 (#4168) Bumps [engine.io](https://github.com/socketio/engine.io) from 6.2.0 to 6.2.1. - [Release notes](https://github.com/socketio/engine.io/releases) - [Changelog](https://github.com/socketio/engine.io/blob/main/CHANGELOG.md) - [Commits](https://github.com/socketio/engine.io/compare/6.2.0...6.2.1) --- updated-dependencies: - dependency-name: engine.io dependency-type: indirect ... Signed-off-by: dependabot[bot] Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- package-lock.json | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/package-lock.json b/package-lock.json index edf88f6d20..5172e30aba 100644 --- a/package-lock.json +++ b/package-lock.json @@ -4437,9 +4437,9 @@ } }, "node_modules/engine.io": { - "version": "6.2.0", - "resolved": "https://registry.npmjs.org/engine.io/-/engine.io-6.2.0.tgz", - "integrity": "sha512-4KzwW3F3bk+KlzSOY57fj/Jx6LyRQ1nbcyIadehl+AnXjKT7gDO0ORdRi/84ixvMKTym6ZKuxvbzN62HDDU1Lg==", + "version": "6.2.1", + "resolved": "https://registry.npmjs.org/engine.io/-/engine.io-6.2.1.tgz", + "integrity": "sha512-ECceEFcAaNRybd3lsGQKas3ZlMVjN3cyWwMP25D2i0zWfyiytVbTpRPa34qrr+FHddtpBVOmq4H/DCv1O0lZRA==", "dev": true, "dependencies": { "@types/cookie": "^0.4.1", @@ -16417,9 +16417,9 @@ } }, "engine.io": { - "version": "6.2.0", - "resolved": "https://registry.npmjs.org/engine.io/-/engine.io-6.2.0.tgz", - "integrity": "sha512-4KzwW3F3bk+KlzSOY57fj/Jx6LyRQ1nbcyIadehl+AnXjKT7gDO0ORdRi/84ixvMKTym6ZKuxvbzN62HDDU1Lg==", + "version": "6.2.1", + "resolved": "https://registry.npmjs.org/engine.io/-/engine.io-6.2.1.tgz", + "integrity": "sha512-ECceEFcAaNRybd3lsGQKas3ZlMVjN3cyWwMP25D2i0zWfyiytVbTpRPa34qrr+FHddtpBVOmq4H/DCv1O0lZRA==", "dev": true, "requires": { "@types/cookie": "^0.4.1", From be3ead6a54d75b2c51fc3a6387baf1d560b0c7de Mon Sep 17 00:00:00 2001 From: lasloche <62240785+lasloche@users.noreply.github.com> Date: Tue, 22 Nov 2022 18:51:29 +0200 Subject: [PATCH 115/280] rise doc maintenance (#4169) --- dev-docs/bidders/minutemedia.md | 6 +++--- dev-docs/bidders/rise.md | 6 +++--- 2 files changed, 6 insertions(+), 6 deletions(-) diff --git a/dev-docs/bidders/minutemedia.md b/dev-docs/bidders/minutemedia.md index 5636f4f49a..218f47a420 100644 --- a/dev-docs/bidders/minutemedia.md +++ b/dev-docs/bidders/minutemedia.md @@ -26,7 +26,7 @@ The MinuteMedia adapter requires setup and approval. Please reach out to hb@minu {: .table .table-bordered .table-striped } | Name | Scope | Type | Description | Example | ---- | ----- | ---- | ----------- | ------- -| `org` | required | String | MinuteMedia publisher Id provided by your MinuteMedia representative | "56f91cd4d3e3660002000033" +| `org` | required | String | MinuteMedia publisher Id provided by your MinuteMedia representative | "1234567890abcdef12345678" | `floorPrice` | optional | Number | Minimum price in USD.

**WARNING:**
Misuse of this parameter can impact revenue | 2.00 | `placementId` | optional | String | A unique placement identifier | "12345678" | `testMode` | optional | Boolean | This activates the test mode | false @@ -46,7 +46,7 @@ var adUnits = [{ bids: [{ bidder: 'minutemedia', params: { - org: '56f91cd4d3e3660002000033', // Required + org: '1234567890abcdef12345678', // Required floorPrice: 0.05, // Optional placementId: '12345678', // Optional testMode: false // Optional @@ -69,7 +69,7 @@ var adUnits = [{ bids: [{ bidder: 'minutemedia', params: { - org: '56f91cd4d3e3660002000033', // Required + org: '1234567890abcdef12345678', // Required floorPrice: 5.00, // Optional placementId: '12345678', // Optional testMode: false // Optional diff --git a/dev-docs/bidders/rise.md b/dev-docs/bidders/rise.md index e00df7eb25..cfda0175e0 100644 --- a/dev-docs/bidders/rise.md +++ b/dev-docs/bidders/rise.md @@ -25,7 +25,7 @@ The Rise adapter requires setup and approval. Please reach out to prebid-rise-en {: .table .table-bordered .table-striped } | Name | Scope | Type | Description | Example | ---- | ----- | ---- | ----------- | ------- -| `org` | required | String | Rise publisher Id provided by your Rise representative | "56f91cd4d3e3660002000033" +| `org` | required | String | Rise publisher Id provided by your Rise representative | "1234567890abcdef12345678" | `floorPrice` | optional | Number | Minimum price in USD.

**WARNING:**
Misuse of this parameter can impact revenue | 2.00 | `placementId` | optional | String | A unique placement identifier | "12345678" | `testMode` | optional | Boolean | This activates the test mode | false @@ -46,7 +46,7 @@ var adUnits = [{ bids: [{ bidder: 'rise', params: { - org: '56f91cd4d3e3660002000033', // Required + org: '1234567890abcdef12345678', // Required floorPrice: 0.05, // Optional placementId: '12345678', // Optional testMode: false // Optional, @@ -70,7 +70,7 @@ var adUnits = [{ bids: [{ bidder: 'rise', params: { - org: '56f91cd4d3e3660002000033', // Required + org: '1234567890abcdef12345678', // Required floorPrice: 5.00, // Optional placementId: '12345678', // Optional testMode: false // Optional, From 851cb6aa5f1ed295ba4f25ecf922aceed0709952 Mon Sep 17 00:00:00 2001 From: Patrick McCann Date: Tue, 22 Nov 2022 11:53:03 -0500 Subject: [PATCH 116/280] Update sync-tid.md (#4170) --- dev-docs/examples/sync-tid.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/dev-docs/examples/sync-tid.md b/dev-docs/examples/sync-tid.md index 79a4cee49a..16b173aa13 100644 --- a/dev-docs/examples/sync-tid.md +++ b/dev-docs/examples/sync-tid.md @@ -10,7 +10,7 @@ about: - imp.ext.tid sync - This example demonstrates sending the same impression transaction identifier (imp.ext.tid) to two on page libraries -jsfiddle_link: https://jsfiddle.net/50aqtrck/1/embedded/html,result +jsfiddle_link: jsfiddle.net/50aqtrck/1/embedded/html,result code_height: 2400 From bfd60ed4c77e0c949dc2e7dd5e50e616a44c9af1 Mon Sep 17 00:00:00 2001 From: Fatih Kaya Date: Tue, 22 Nov 2022 20:56:30 +0300 Subject: [PATCH 117/280] Pixad Bidder PR Doc (#4130) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit * AdMatic Bidder PR Doc https://github.com/prebid/Prebid.js/pull/9133 * Update admatic.md * Update admatic.md * Update admatic.md * Pixad Bidder PR Doc https://github.com/prebid/Prebid.js/pull/9133 ## 🏷 Type of documentation - [X] new bid adapter - [ ] update bid adapter - [ ] new feature - [ ] text edit only (wording, typos) - [ ] bugfix (code examples) - [ ] new examples ## 📋 Checklist - [ ] Related pull requests in prebid.js or server are linked - [X] For new adapters check [https://github.com/prebid/Prebid.js/pull/9133]) * Revert "Pixad Bidder PR Doc" This reverts commit d4a52f832bc355dab840df4f78da2addea01ff82. * pixad add * Added host line * Revert "Added host line" This reverts commit 16d4784b32928ff83c8987f15b3f5a0550006ac8. * Revert "pixad add" This reverts commit aeb422ee201a459494b67e9140ce1e9baeb4655d. * added pixad.md and changed admatic.md * Update pixad.md --- dev-docs/bidders/admatic.md | 11 ++++-- dev-docs/bidders/pixad.md | 70 +++++++++++++++++++++++++++++++++++++ 2 files changed, 78 insertions(+), 3 deletions(-) create mode 100644 dev-docs/bidders/pixad.md diff --git a/dev-docs/bidders/admatic.md b/dev-docs/bidders/admatic.md index 920991a202..df3bcac85f 100644 --- a/dev-docs/bidders/admatic.md +++ b/dev-docs/bidders/admatic.md @@ -1,8 +1,9 @@ --- layout: bidder title: AdMatic -description: Prebid AdMatica Bidder Adapter. +description: Prebid AdMatic Bidder Adapter. pbjs: true +pbs: false biddercode: admatic media_types: banner,video gdpr_supported: false @@ -22,9 +23,11 @@ AdMatic header bidding adapter connects with AdMatic demand sources to fetch bid ### Bid params +{: .table .table-bordered .table-striped } | Name | Scope | Description | Example | Type | |--------------|----------|------------------------------------|------------|----------| | `networkId` | required | The network ID from AdMatic | `12345` | `number` | +| `host` | required | RTB Host | `layer.serve.admatic.com.tr` | `string` | ### Test Parameters @@ -36,7 +39,8 @@ var adUnits = [{ bids: [{ bidder: 'admatic', params: { - networkId: 12345 + networkId: 12345, + host: 'layer.serve.admatic.com.tr' } }] },{ @@ -45,7 +49,8 @@ var adUnits = [{ bids: [{ bidder: 'admatic', params: { - networkId: 12345 + networkId: 12345, + host: 'layer.serve.admatic.com.tr' } }] }]; diff --git a/dev-docs/bidders/pixad.md b/dev-docs/bidders/pixad.md new file mode 100644 index 0000000000..606763f8c9 --- /dev/null +++ b/dev-docs/bidders/pixad.md @@ -0,0 +1,70 @@ +--- +layout: bidder +title: Pixad +description: Prebid Pixad Bidder Adapter. +pbjs: true +pbs: false +biddercode: pixad +media_types: banner,video +gdpr_supported: false +usp_supported: false +coppa_supported: false +schain_supported: false +dchain_supported: false +userIds: criteo, id5Id, sharedId, unifiedId +safeframes_ok: true +floors_supported: false +aliasCode: admatic +multiformat_supported: will-bid-on-any +--- + +### Description + +Pixad header bidding adapter connects with Pixad demand sources to fetch bids for banner network ID. Please reach out to your account manager or for more information. + +### Bid params + +{: .table .table-bordered .table-striped } +| Name | Scope | Description | Example | Type | +|-------------|----------|-------------------------------------|----------|----------| +| `networkId` | required | The network ID from Pixad | `12345` | `number` | +| `host` | required | RTB Host | `rtb.network.pixad.com.tr` | `string` | + +### Test Parameters + +300x250 banner test +``` +var adUnits = [{ + code: 'your-slot_1-div', //use exactly the same code as your slot div id. + sizes: [[300, 250]], + bids: [{ + bidder: 'pixad', + params: { + networkId: 12345, + host: 'rtb.network.pixad.com.tr' + } + }] +},{ + code: 'your-slot_2-div', //use exactly the same code as your slot div id. + sizes: [[600, 800]], + bids: [{ + bidder: 'pixad', + params: { + networkId: 12345, + host: 'rtb.network.pixad.com.tr' + } + }] +}]; +``` + +## UserSync example + +``` +pbjs.setConfig({ + userSync: { + iframeEnabled: true, + syncEnabled: true, + syncDelay: 1 + } +}); +``` From 16b5577205d842d165c2bf6d9690f7dc690cf123 Mon Sep 17 00:00:00 2001 From: bretg Date: Tue, 22 Nov 2022 13:29:23 -0500 Subject: [PATCH 118/280] Update bidder-adaptor.md --- dev-docs/bidder-adaptor.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/dev-docs/bidder-adaptor.md b/dev-docs/bidder-adaptor.md index 648d7116a3..62493b83f8 100644 --- a/dev-docs/bidder-adaptor.md +++ b/dev-docs/bidder-adaptor.md @@ -350,7 +350,7 @@ There are a number of important values that a publisher expects to be handled in | Bidder Timeout | Use if your endpoint needs to know how long the page is allowing the auction to run. | config.getConfig('bidderTimeout'); | | COPPA | If your endpoint supports the Child Online Privacy Protection Act, you should read this value. | config.getConfig('coppa'); | | First Party Data | The publisher, as well as a number of modules, may provide [first party data](/features/firstPartyData.html) (e.g. page type). | bidderRequest.ortb2; validBidRequests[].ortb2Imp| -| Floors | Adapters that accept a floor parameter must also support the [floors module](https://docs.prebid.org/dev-docs/modules/floors.html) | [`getFloor()`](/dev-docs/modules/floors.html#bid-adapter-interface) | +| Floors | Adapters that accept a floor parameter must also support the [floors module](https://docs.prebid.org/dev-docs/modules/floors.html) | [`bidRequest.getFloor()`](/dev-docs/modules/floors.html#bid-adapter-interface) | | Page URL and referrer | Instead of building your own function to find the page location, domain, or referrer, look in the standard bidRequest location. | bidderRequest.refererInfo.page | | [Supply Chain](/dev-docs/modules/schain.html) | Adapters cannot accept an schain parameter. Rather, they must look for the schain parameter at bidRequest.schain. | bidRequest.schain | | Video Parameters | Video params must be read from AdUnit.mediaType.video when available; however bidder config can override the ad unit. | AdUnit.mediaType.video | From 33adfe909cc1ffea3663669e973461877926a8f2 Mon Sep 17 00:00:00 2001 From: Wiem Zine El Abidine Date: Wed, 23 Nov 2022 15:26:07 +0100 Subject: [PATCH 119/280] fix alert info (#4172) --- dev-docs/modules/userId.md | 1 + 1 file changed, 1 insertion(+) diff --git a/dev-docs/modules/userId.md b/dev-docs/modules/userId.md index 4fe7dbfa9b..8f7334bf2a 100644 --- a/dev-docs/modules/userId.md +++ b/dev-docs/modules/userId.md @@ -1240,6 +1240,7 @@ LiveIntent offers audience resolution by leveraging our next-generation identity Build your Prebid.js package to include the LiveIntent nonID using the standard version which allows publishers to include the module with full functionalities, like hashing email addresses and identity resolution. Add the **full** LiveIntent Identity module to your Prebid.js package with: + {: .alert.alert-info :} gulp build --modules=userId,liveIntentIdSystem From 855131ced60e0b66cd3cca1d45f35ee598711625 Mon Sep 17 00:00:00 2001 From: Vladimir Date: Wed, 23 Nov 2022 17:28:25 +0300 Subject: [PATCH 120/280] add viqeo prebid adapter (#3987) * add viqeo prebid adapter + + * Add whitespace between header and table * updated to Outstream Co-authored-by: Muki Seiler --- dev-docs/bidders/viqeo.md | 39 +++++++++++++++++++++++++++++++++++++++ 1 file changed, 39 insertions(+) create mode 100644 dev-docs/bidders/viqeo.md diff --git a/dev-docs/bidders/viqeo.md b/dev-docs/bidders/viqeo.md new file mode 100644 index 0000000000..8f88f19e56 --- /dev/null +++ b/dev-docs/bidders/viqeo.md @@ -0,0 +1,39 @@ +--- +layout: bidder +title: viqeo +description: Prebid Outstream Viqeo Bidder Adaptor +biddercode: viqeo +pbjs: true +floors_supported: true +media_types: video +--- + +### Note + +All references to the OpenRTB spec refer to OpenRtb v2.5 (https://www.iab.com/wp-content/uploads/2016/03/OpenRTB-API-Specification-Version-2-5-FINAL.pdf) + +The Viqeo Bidder Adapter requires setup and approval from Viqeo. + +Please reach out to for more information. + + +### Bid params + +{: .table .table-bordered .table-striped } +| Name | Scope | Description | Example | Type | +|-----------------------------|----------|----------------------------------------------------------------------------------------------------------------------------|--------------------------|-----------| +| `user` | required | The object containing user data (See OpenRTB spec) | `user: {}` | `object` | +| `user.buyeruid` | required | User id | `"12345"` | `string` | +| `playerOptions` | required | The object containing Viqeo player options | `playerOptions: {}` | `object` | +| `playerOptions.profileId` | required | Viqeo profile id | `1382` | `number` | +| `playerOptions.videId` | optional | Viqeo video id | `"ed584da454c7205ca7e4"` | `string` | +| `playerOptions.playerId` | optional | Viqeo player id | `1` | `number` | +| `device` | optional | The object containing device data (See OpenRTB spec) | `device: {}` | `object` | +| `site` | optional | The object containing site data (See OpenRTB spec) | `site: {}` | `object` | +| `app` | optional | The object containing app data (See OpenRTB spec) | `app: {}` | `object` | +| `floor` | optional | Bid floor price | `0.5` | `number` | +| `currency` | optional | 3-letter ISO 4217 code defining the currency of the bid. | `EUR` | `string` | +| `test` | optional | Flag which will induce a sample bid response when true; only set to true for testing purposes (1 = true, 0 = false) | `1` | `integer` | +| `sspId` | optional | For debug, request id | `1` | `number` | +| `renderUrl` | optional | For debug, script player url | `"https://viqeo.tv"` | `string` | +| `endpointUrl` | optional | For debug, api endpoint | `"https://viqeo.tv"` | `string` | From 6490324a5669e567b33772381fe23825990a3e8d Mon Sep 17 00:00:00 2001 From: chtdsp <109642171+chtdsp@users.noreply.github.com> Date: Wed, 23 Nov 2022 22:31:25 +0800 Subject: [PATCH 121/280] add chtnw bid adapter documentation (#4016) * add chtnw bid adapter documentation * add chtnw missing metadata --- dev-docs/bidders/chtnw.md | 23 +++++++++++++++++++++++ 1 file changed, 23 insertions(+) create mode 100644 dev-docs/bidders/chtnw.md diff --git a/dev-docs/bidders/chtnw.md b/dev-docs/bidders/chtnw.md new file mode 100644 index 0000000000..ff24d8dc4a --- /dev/null +++ b/dev-docs/bidders/chtnw.md @@ -0,0 +1,23 @@ +--- +layout: bidder +title: chtnw +description: Prebid CHTNW Bidder Adaptor +pbjs: true +biddercode: chtnw +media_types: banner, video, native +gvl_id: none +gdpr_supported: false +usp_supported: false +coppa_supported: false +schain_supported: false +dchain_supported: false +prebid_member: false +--- + +### Bid Params + +{: .table .table-bordered .table-striped } +| Name | Scope | Description | Example | Type | +|---------------|----------|----------------------|----------------------|----------| +| `placementId` | required | The CHT placement ID | `'38EL412LO82XR9O6'` | `string` | + From a561abeae3f60b0b34915408ceb47c498e1fb417 Mon Sep 17 00:00:00 2001 From: haruka-yamashita2 <39541428+haruka-yamashita2@users.noreply.github.com> Date: Wed, 23 Nov 2022 23:40:12 +0900 Subject: [PATCH 122/280] Update dacid userid module documents (#4045) * update AudienceOne ID in userId.md * add comment to AudienceOne ID in userId.md --- dev-docs/modules/userId.md | 9 +++++++-- 1 file changed, 7 insertions(+), 2 deletions(-) diff --git a/dev-docs/modules/userId.md b/dev-docs/modules/userId.md index 8f7334bf2a..f0701fa72d 100644 --- a/dev-docs/modules/userId.md +++ b/dev-docs/modules/userId.md @@ -481,7 +481,7 @@ pbjs.setConfig({ ### AudienceOne ID by DAC AudienceOne ID, provided by [D.A.Consortium Inc.](https://www.dac.co.jp/), is ID for ad targeting by using 1st party cookie. -Please contact D.A.Consortium Inc. before using this ID. +Please visit [https://solutions.dac.co.jp/audienceone](https://solutions.dac.co.jp/audienceone) and request your Owner ID to get started. Add the AudienceOne ID to your Prebid.js Package with: @@ -494,6 +494,8 @@ gulp build --modules=dacIdSystem | Param under userSync.userIds[] | Scope | Type | Description | Example | | --- | --- | --- | --- | --- | | name | Required | String | The name of this module | `"dacId"` | +| params | Required | Object | Details of module params. | | +| params.oid | Required | String | This is the Owner ID value obtained via D.A.Consortium Inc. | `"55h67qm4ck37vyz5"` | #### AudienceOne ID Example @@ -501,7 +503,10 @@ gulp build --modules=dacIdSystem pbjs.setConfig({ userSync: { userIds: [{ - name: 'dacId' + name: 'dacId', + params: { + 'oid': '55h67qm4ck37vyz5' // Set your AudienceOne Owner ID here + } }] } }); From 6a115626d29510ea11164c0a429020c73eba4988 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Udi=20Talias=20=E2=9A=9B=EF=B8=8F?= Date: Wed, 23 Nov 2022 16:41:11 +0200 Subject: [PATCH 123/280] docs(module): kueezrtb adapter dev-docs (#4052) * docs(module): kueezrtb adapter dev-docs * docs(module): update subDomain default value * docs(module): updated kueezrtb flags * added GVLID code --- dev-docs/bidders/kueezrtb.md | 32 ++++++++++++++++++++++++++++++++ 1 file changed, 32 insertions(+) create mode 100644 dev-docs/bidders/kueezrtb.md diff --git a/dev-docs/bidders/kueezrtb.md b/dev-docs/bidders/kueezrtb.md new file mode 100644 index 0000000000..0369b939e0 --- /dev/null +++ b/dev-docs/bidders/kueezrtb.md @@ -0,0 +1,32 @@ +--- +layout: bidder +title: KueezRTB +description: Prebid KueezRTB Bidder Adaptor +biddercode: kueezrtb +userIds: britepoolId, criteo, id5Id, identityLink, liveIntentId, netId, parrableId, pubCommonId, unifiedId +gdpr_supported: true +usp_supported: true +coppa_supported: false +schain_supported: true +floors_supported: true +media_types: banner +prebid_member: false +safeframes_ok: false +deals_supported: false +pbs_app_supported: false +fpd_supported: false +ortb_blocking_supported: false +multiformat_supported: will-bid-on-one +gvl_id: 1165 +pbjs: true +--- + +### Bid Params + +{: .table .table-bordered .table-striped } +| Name | Scope | Description | Example | Type | +|------------|----------|-------------------------------------------------------------------------------------------|------------------------------|----------| +| `cId` | required | The connection ID from KueezRTB. | `'562524b21b1c1f08117fc7f9'` | `string` | +| `pId` | required | The publisher ID from KueezRTB. | `'59ac17c192832d0011283fe3'` | `string` | +| `bidFloor` | required | The minimum bid value desired. KueezRTB will not respond with bids lower than this value. | `0.90` | `float` | +| `subDomain`| optional | Sets the server subdomain, default: 'exchange'. | `'exchange'` | `string` | From 767721d0153283b688bbffaeb9f67f17c8c05b63 Mon Sep 17 00:00:00 2001 From: sag-celejd <109062661+sag-celejd@users.noreply.github.com> Date: Wed, 23 Nov 2022 15:54:58 +0100 Subject: [PATCH 124/280] SUNT Content Bid Adapter: New Adapter (#4076) * Add suntContent.md * Fix: Wrong gvl_id for SUNT Content --- dev-docs/bidders/suntContent.md | 30 ++++++++++++++++++++++++++++++ 1 file changed, 30 insertions(+) create mode 100644 dev-docs/bidders/suntContent.md diff --git a/dev-docs/bidders/suntContent.md b/dev-docs/bidders/suntContent.md new file mode 100644 index 0000000000..13c7b0b855 --- /dev/null +++ b/dev-docs/bidders/suntContent.md @@ -0,0 +1,30 @@ +--- +layout: bidder +title: SUNT Content +description: Prebid SUNT Content Bidder Adapter +biddercode: suntContent +gdpr_supported: true +gvl_id: 1097 +usp_supported: false +coppa_supported: false +schain_supported: false +dchain_supported: false +userId: none +media_types: banner, native +safeframes_ok: true +deals_supported: false +floors_supported: true +fpd_supported: false +pbjs: true +pbs: true +pbs_app_supported: false +prebid_member: false +--- + +### Bid params + +{: .table .table-bordered .table-striped } +| Name | Scope | Description | Example | Type | +|-------------|----------|----------------------|--------------------|-----------| +| `adUnitId` | required | ID of the Ad Unit | `8ao` | `string` | +| `url` | optional | URL from the Page | `example.tld` | `string` | From f3dd1050c5bc0e209f4cb60f39cb0e1908f01a35 Mon Sep 17 00:00:00 2001 From: mwang-sticky Date: Thu, 24 Nov 2022 01:39:14 +0800 Subject: [PATCH 125/280] freewheel ssp add prebid go adapter - update freewheel dev doc (#4094) * update dev doc * rename freewheelssp bidder name --- dev-docs/bidders/{freewheel-ssp.md => freewheelssp.md} | 10 ++++++++-- 1 file changed, 8 insertions(+), 2 deletions(-) rename dev-docs/bidders/{freewheel-ssp.md => freewheelssp.md} (68%) diff --git a/dev-docs/bidders/freewheel-ssp.md b/dev-docs/bidders/freewheelssp.md similarity index 68% rename from dev-docs/bidders/freewheel-ssp.md rename to dev-docs/bidders/freewheelssp.md index f264e52b00..9de1d2897d 100644 --- a/dev-docs/bidders/freewheel-ssp.md +++ b/dev-docs/bidders/freewheelssp.md @@ -1,12 +1,18 @@ --- layout: bidder -title: FreeWheel-ssp +title: freeWheelssp description: Freewheel Bidder Adaptor pbjs: true -biddercode: freewheel-ssp +pbs: true +biddercode: freewheelssp +aliasCode: freewheel-ssp +gvl_id: 285 gdpr_supported: true usp_supported: true +coppa_supported: true +schain_supported: true media_types: video +ortb_blocking_supported: partial --- ### Bid Params From cd9d3c9a4f808a7aff777d8f67c52e14de80c6a2 Mon Sep 17 00:00:00 2001 From: Joel Meyer Date: Wed, 23 Nov 2022 18:39:50 +0100 Subject: [PATCH 126/280] fledgeForGpt Module Docs (#4089) * fledgeForGpt Module Docs Add documentation for the experimental FLEDGE support module. * Update fledgeForGpt.md adding layout header * relative links, related reading Co-authored-by: jdwieland8282 Co-authored-by: bretg --- dev-docs/modules/fledgeForGpt.md | 154 +++++++++++++++++++++++++++++++ 1 file changed, 154 insertions(+) create mode 100644 dev-docs/modules/fledgeForGpt.md diff --git a/dev-docs/modules/fledgeForGpt.md b/dev-docs/modules/fledgeForGpt.md new file mode 100644 index 0000000000..73ce049110 --- /dev/null +++ b/dev-docs/modules/fledgeForGpt.md @@ -0,0 +1,154 @@ +--- +layout: page_v2 +page_type: module +title: Module - fledgeForGpt +description: how to use fledge with GPT +module_code : fledgeForGpt +display_name : Fledge for GPT +enable_download : true +sidebarType : 1 +--- + +# Overview +This module allows Prebid.js to support FLEDGE by integrating it with GPT's [experimental FLEDGE +support](https://github.com/google/ads-privacy/tree/master/proposals/fledge-multiple-seller-testing). + +To learn more about FLEDGE in general, go [here](https://github.com/WICG/turtledove/blob/main/FLEDGE.md). + +This document covers the steps necessary for publishers to enable FLEDGE on their inventory. It also describes +the changes Bid Adapters need to implement in order to support FLEDGE. + +## Publisher Integration +Publishers wishing to enable FLEDGE support must do two things. First, they must compile Prebid.js with support for this module. +This is accomplished by adding the `fledgeForGpt` module to the list of modules they are already using: + +``` +gulp build --modules=fledgeForGpt,... +``` + +Second, they must enable FLEDGE in their Prebid.js configuration. To provide a high degree of flexiblity for testing, FLEDGE +settings exist at the module level, the bidder level, and the adunit level. + +### Module Configuration +This module exposes the following settings: + +|Name |Type |Description |Notes | +| :------------ | :------------ | :------------ |:------------ | +|enabled | Boolean |Enable/disable the module |Defaults to `false` | + +As noted above, FLEDGE support is disabled by default. To enable it, set the `enabled` value to `true` for this module +using the `setConfig` method of Prebid.js: + +```js +pbjs.que.push(function() { + pbjs.setConfig({ + fledgeForGpt: { + enabled: true + } + }); +}); +``` + +### Bidder Configuration +This module adds the following setting for bidders: + +|Name |Type |Description |Notes | +| :------------ | :------------ | :------------ |:------------ | +| fledgeEnabled | Boolean | Enable/disable a bidder to participate in FLEDGE | Defaults to `false` | + +In addition to enabling FLEDGE at the module level, individual bidders must also be enabled. This allows publishers to +selectively test with one or more bidders as they desire. To enable one or more bidders, use the `setBidderConfig` method +of Prebid.js: + +```js +pbjs.setBidderConfig({ + bidders: ["openx"], + config: { + fledgeEnabled: true + } +}); +``` + +### AdUnit Configuration +Enabling an adunit for FLEDGE eligibility is accomplished by setting an attribute of the `ortb2Imp` object for that +adunit. + +|Name |Type |Description |Notes | +| :------------ | :------------ | :------------ |:------------ | +| ortb2Imp.ext.ae | Integer | Auction Environment: 1 indicates FLEDGE eligible, 0 indicates it is not | Absence indicates this is not FLEDGE eligible | + +The `ae` field stands for Auction Environment and was chosen to be consistent with the field that GAM passes to bidders +in their Open Bidding and Exchange Bidding APIs. More details on that can be found +[here](https://github.com/google/ads-privacy/tree/master/proposals/fledge-rtb#bid-request-changes-indicating-interest-group-auction-support) +In practice, this looks as follows: + +```js +pbjs.addAdUnits({ + code: "my-adunit-div", + // other config here + ortb2Imp: { + ext: { + ae: 1 + } + } +}); +``` + +## Bid Adapter Integration +Chrome has enabled a two-tier auction in FLEDGE. This allows multiple sellers (frequently SSPs) to act on behalf of the publisher with +a single entity serving as the final decision maker. In their [current approach](https://github.com/google/ads-privacy/tree/master/proposals/fledge-multiple-seller-testing), +GPT has opted to run the final auction layer while allowing other SSPs/sellers to participate as +[Component Auctions](https://github.com/WICG/turtledove/blob/main/FLEDGE.md#21-initiating-an-on-device-auction) which feed their +bids to the final layer. To learn more about Component Auctions, go [here](https://github.com/WICG/turtledove/blob/main/FLEDGE.md#24-scoring-bids-in-component-auctions). + +The FLEDGE auction, including Component Auctions, are configured via an `AuctionConfig` object that defines the parameters of the auction for a given +seller. This module enables FLEDGE support by allowing bid adaptors to return `AuctionConfig` objects in addition to bids. If a bid adaptor returns an +`AuctionConfig` object, Prebid.js will register it with the appropriate GPT ad slot so the bidder can participate as a Component Auction in the overall +FLEDGE auction for that slot. More details on the GPT API can be found [here](https://developers.google.com/publisher-tag/reference#googletag.config.componentauctionconfig). + +Modifying a bid adapter to support FLEDGE is a straightforward process and consists of the following steps: +1. Detecting when a bid request is FLEDGE eligible +2. Responding with AuctionConfig + +FLEDGE eligibility is made available to bid adapters through the `bidderRequest.fledgeEnabled` field. +The [`bidderRequest`](/dev-docs/bidder-adaptor.html#bidderrequest-parameters) object is passed to +the [`buildRequests`](/dev-docs/bidder-adaptor.html#building-the-request) method of an adapter. Bid adapters +who wish to participate should read this flag and pass it to their server. FLEDGE eligibility depends on a number of parameters: + +1. Chrome enablement +2. Publisher participatipon in the [Origin Trial](https://developer.chrome.com/docs/privacy-sandbox/unified-origin-trial/#configure) +3. Publisher Prebid.js configuration (detailed above) + +When a bid request is FLEDGE enabled, a bid adapter can return a tuple consisting of bids and AuctionConfig objects rather than just a list of bids: + +```js +function interpretResponse(resp, req) { + // Load the bids from the response - this is adapter specific + const bids = parseBids(resp); + + // Load the auctionConfigs from the response - also adapter specific + const auctionConfigs = parseAuctionConfigs(resp); + + if (auctionConfigs) { + // Return a tuple of bids and auctionConfigs. It is possible that bids could be null. + return {bids, auctionConfigs}; + } else { + return bids; + } +} +``` + +An AuctionConfig must be associated with an adunit and auction, and this is accomplished using the value in the `bidId` field from the objects in the +`validBidRequests` array passed to the `buildRequests` function - see [here](/dev-docs/bidder-adaptor.html#ad-unit-params-in-the-validbidrequests-array) +for more details. This means that the AuctionConfig objects returned from `interpretResponse` must contain a `bidId` field whose value corresponds to +the request it should be associated with. This may raise the question: why isn't the AuctionConfig object returned as part of the bid? The +answer is that it's possible to participate in the FLEDGE auction without returning a contextual bid. + +An example of this can be seen in the OpenX OpenRTB bid adapter [here](https://github.com/prebid/Prebid.js/blob/master/modules/openxOrtbBidAdapter.js#L327). + +Other than the addition of the `bidId` field, the `AuctionConfig` object should adhere to the requirements set forth in FLEDGE. The details of creating an +`AuctionConfig` object are beyond the scope of this document. + +## Related Reading +- [FLEDGE](https://github.com/WICG/turtledove/blob/main/FLEDGE.md) +- [Component Auctions](https://github.com/WICG/turtledove/blob/main/FLEDGE.md#21-initiating-an-on-device-auction) From 7d11a333c499a2a1f0f6ad11e742ca089ff409f7 Mon Sep 17 00:00:00 2001 From: John Conway Date: Wed, 23 Nov 2022 12:48:43 -0500 Subject: [PATCH 127/280] Add zeusPrimeRtdProvider Documentation Page (#4117) * docs: added zeusPrimeRtdProvider documentation * chore: updated the Zeus Prime RTD docs page * docs: clean up the zeusPrime documentation for waitForIt per PR feedback --- dev-docs/modules/zeusPrimeRtdProvider.md | 66 ++++++++++++++++++++++++ 1 file changed, 66 insertions(+) create mode 100644 dev-docs/modules/zeusPrimeRtdProvider.md diff --git a/dev-docs/modules/zeusPrimeRtdProvider.md b/dev-docs/modules/zeusPrimeRtdProvider.md new file mode 100644 index 0000000000..93df3cd365 --- /dev/null +++ b/dev-docs/modules/zeusPrimeRtdProvider.md @@ -0,0 +1,66 @@ +--- +layout: page_v2 +title: Zeus Prime Real Time Data Provider +display_name: Zeus Prime RTD +description: Zeus Prime Real Time Data Module +page_type: module +module_code: zeusPrimeRtdProvider +module_type: rtd +enable_download: true +vendor_specific: true +sidebarType: 1 +--- + +# Zeus Prime Real Time Data Module + +The Zeus Prime RTD Provider provides integration of Zeus Prime onto sites with Prebid. This module will request information from Zeus Prime servers to add the page level targeting required for Prime into the customer's ad setup. + +Zeus Prime runs as soon as the code is initialized, so it can retrieve the information required from the Zeus Prime server to create the targeting key-values. Zeus Prime will provide two page level key-values: `zeus_` and `zeus_insights`. Zeus Prime provides contextual information about a pages content, and does not provide user information that could present privacy implications. + +For more information and help with setting up Zeus Prime, see the [onboarding documentation site](https://onboarding.zeustechnology.com). + +## Usage + +To use Zeus Prime, add `zeusPrimeRtdProvider` into your Prebid build: + +``` +gulp build --modules=rtdModule,zeusPrimeRtdProvider +``` + +> Note that the global RTD module, `rtdModule`, is required for the Zeus Prime RTD module. + +Once the code is included, configure Zeus Prime in your Prebid configuration: + +```javascript +pbjs.setConfig({ + ..., + realTimeData: { + dataProviders: [{ + name: 'zeusPrime', + params: { + gamId: '' + } + }] + }, + ... +}) +``` + +## Parameters + +The parameters below describe the configuration object used to configure Zeus Prime. + +| Name | Type | Description | Notes | +| ------------ | ------- | ----------------------------------------------------------------------- | --------- | +| name | String | This will always be `zeusPrime` | - | +| waitForIt | Boolean | Should the auction delay until Zeus Prime completes. (optional) | Defaults to `false`. | +| params | Object | | - | +| params.gamId | String | The gamId or Google Ad Manager Network Code. | - | + +### `gamId` Parameter + +Zeus Prime requires the gamId parameter, or the Google Ad Manager Network Code, to reference your account. See the [Google documentation](https://support.google.com/admanager/answer/7674889?hl=en) to find out where you can retrieve the Network Code. + +## Troubleshooting + +For troubleshooting steps and guides to assist with verifying your Zeus Prime installation, see our [installation documentation](https://onboarding.zeustechnology.com/docs/installation). From 433bf68c0a530bc25b03c376d8ff603548bd65fb Mon Sep 17 00:00:00 2001 From: cuihua111 <734376178@qq.com> Date: Thu, 24 Nov 2022 03:14:54 +0800 Subject: [PATCH 128/280] DiscoveryDsp parameter change (#4133) * DiscoveryDSP prebid adapter * update discovery md * change enable_download value * parameter change * add quotes Co-authored-by: v_cuidong --- dev-docs/bidders/discovery.md | 9 ++++++--- 1 file changed, 6 insertions(+), 3 deletions(-) diff --git a/dev-docs/bidders/discovery.md b/dev-docs/bidders/discovery.md index 97289caf40..3dec8630ca 100644 --- a/dev-docs/bidders/discovery.md +++ b/dev-docs/bidders/discovery.md @@ -17,7 +17,8 @@ The DiscoveryDSP Bidding adapter requires setup before beginning. Please contact | Name | Scope | Description | Example | Type | |---------------|----------|-----------------------|-----------|-----------| | `token` | required | publisher token | `'1e100887dd614b7f69fdd1360437'` | `string` | -| `media` | required | publisher media host | `xxx.com` | `string` | +| `tagid` | required | tagid | `'abcdefg'` | `string` | +| `publisher` | required | publisher id | `'abcdefg'` | `string` | #### Prebid Server Test Request @@ -36,7 +37,8 @@ var adUnits = [ bidder: "discovery", params: { token: "a4e66b955e3b19b88a357b4ace01ac31", - media: 'example.com' + tagid: 'test_tagid', + publisher: 'test_publisher' }, }, ], @@ -64,7 +66,8 @@ var adUnits = [ bidder: "discovery", params: { token: "03d467db07075683b0c373b6b3d3113c", - media: 'ppnews.com' + tagid: 'test_tagid', + publisher: 'test_publisher' }, }, ], From 8f9fff41c206cd7fce483faa40e5369b6b6d6b6b Mon Sep 17 00:00:00 2001 From: bretg Date: Wed, 23 Nov 2022 14:23:18 -0500 Subject: [PATCH 129/280] fixing header levels (#4175) --- dev-docs/bidders/adtarget.md | 2 +- dev-docs/bidders/aseal.md | 4 ++-- dev-docs/bidders/dailyhunt.md | 2 +- dev-docs/bidders/duration.md | 2 +- dev-docs/bidders/iqm.md | 8 ++++---- dev-docs/bidders/nobid.md | 2 +- dev-docs/bidders/quantumdex.md | 2 +- dev-docs/bidders/valueimpression.md | 2 +- dev-docs/bidders/yieldmo.md | 7 ++++--- 9 files changed, 16 insertions(+), 15 deletions(-) diff --git a/dev-docs/bidders/adtarget.md b/dev-docs/bidders/adtarget.md index f8e832bfff..f73ad7aa67 100644 --- a/dev-docs/bidders/adtarget.md +++ b/dev-docs/bidders/adtarget.md @@ -25,7 +25,7 @@ To use the Adtarget bidder you will need an aid from an exchange account on [htt | `aid` | required | The source ID from Adtarget platform. | `529814` | `integer` | -# Description +### Description Provides a solution for accessing Video demand and display demand from Adtarget diff --git a/dev-docs/bidders/aseal.md b/dev-docs/bidders/aseal.md index 604623a724..5b2bfafe9c 100644 --- a/dev-docs/bidders/aseal.md +++ b/dev-docs/bidders/aseal.md @@ -14,7 +14,7 @@ media_types: banner |-----------------|----------|---------------------------------|------------------------------------------|--------------------| | `placeUid` | required | The Place UID from Aotter | `'f4a74f73-9a74-4a87-91c9-545c6316c23d'` | `string` | -# Configuration +### Configuration Following configuration is required: @@ -26,7 +26,7 @@ pbjs.setConfig({ }); ``` -# Ad Unit Example +### Ad Unit Example ```js var adUnits = [ diff --git a/dev-docs/bidders/dailyhunt.md b/dev-docs/bidders/dailyhunt.md index 8054d482d2..682da1f2cb 100644 --- a/dev-docs/bidders/dailyhunt.md +++ b/dev-docs/bidders/dailyhunt.md @@ -28,7 +28,7 @@ pbjs_version_notes: not ported to 5.x **Notes: The `video`, `site`, `device`, `user`, `publisher` objects are all ORTB objects. Please refer to the [ORTB documentation](https://www.iab.com/wp-content/uploads/2016/03/OpenRTB-API-Specification-Version-2-5-FINAL.pdf) for additional details.** -# Test Parameters +### Test Parameters ``` var adUnits = [ { diff --git a/dev-docs/bidders/duration.md b/dev-docs/bidders/duration.md index 2c2e61cb9a..ae9587090c 100644 --- a/dev-docs/bidders/duration.md +++ b/dev-docs/bidders/duration.md @@ -31,7 +31,7 @@ If you are using Google Ad Manager (GAM), it is highly recommended to make sure If you absolutely want to run Duration Media in a Saferame creative, please contact your Duration Media repsentative to coordinate this setup. -# Test Parameters +### Test Parameters ``` var adUnits = [ { diff --git a/dev-docs/bidders/iqm.md b/dev-docs/bidders/iqm.md index a3251a5a72..fdde32f1d7 100644 --- a/dev-docs/bidders/iqm.md +++ b/dev-docs/bidders/iqm.md @@ -6,7 +6,7 @@ pbjs: true biddercode: iqm --- -# Parameters +## Parameters {: .table .table-bordered .table-striped } | Name | Scope | Description | Example | @@ -16,11 +16,11 @@ biddercode: iqm | `placementId` | required | The Placement ID from iQM | 23451 | | `bidfloor` | optional | Bid Floor | 0.50 | -# Description +## Description Module that connects to iQM demand sources -# Test Parameters +## Test Parameters ``` var adUnits = [{ code: 'div-gpt-ad-1460505748561-0', @@ -47,7 +47,7 @@ var adUnits = [{ ``` -# adUnit Video +## adUnit Video ``` var videoAdUnit = { diff --git a/dev-docs/bidders/nobid.md b/dev-docs/bidders/nobid.md index 7f8cfd41dd..978aa79e7d 100644 --- a/dev-docs/bidders/nobid.md +++ b/dev-docs/bidders/nobid.md @@ -30,7 +30,7 @@ If you are using Google Ad Manager (GAM), it is highly recommended to make sure If you absolutely want to run NoBid in a Saferame creative, please contact your Nobid repsentative to coordinate this setup. -# Test Parameters +### Test Parameters ``` var adUnits = [ { diff --git a/dev-docs/bidders/quantumdex.md b/dev-docs/bidders/quantumdex.md index 7391497300..e4f2ddd486 100644 --- a/dev-docs/bidders/quantumdex.md +++ b/dev-docs/bidders/quantumdex.md @@ -15,5 +15,5 @@ pbs: true pbs_app_supported: true --- -# Description +## Description Quantumdex is an aliased bidder of Apacdex bid adapter. Please refer to [Apacdex documentation](https://docs.prebid.org/dev-docs/bidders/apacdex) for bid parameters and implementation guide. diff --git a/dev-docs/bidders/valueimpression.md b/dev-docs/bidders/valueimpression.md index 4b47750e85..25605f3ace 100644 --- a/dev-docs/bidders/valueimpression.md +++ b/dev-docs/bidders/valueimpression.md @@ -15,5 +15,5 @@ pbs: true pbs_app_supported: true --- -# Description +## Description Valueimpression is an aliased bidder of Apacdex bid adapter. Please refer to [Apacdex documentation](https://docs.prebid.org/dev-docs/bidders/apacdex) for bid parameters and implementation guide. diff --git a/dev-docs/bidders/yieldmo.md b/dev-docs/bidders/yieldmo.md index 86998b1c85..36dec2c80d 100644 --- a/dev-docs/bidders/yieldmo.md +++ b/dev-docs/bidders/yieldmo.md @@ -13,9 +13,10 @@ pbjs: true pbs: true --- -# Registration -### Note: In order to use Yieldmo adapter please reach out to your Yieldmo account's person or support@yieldmo.com for more information. -
+### Registration + +Note: In order to use Yieldmo adapter please reach out to your Yieldmo account's person or support@yieldmo.com for more information. + ### Bid Params {: .table .table-bordered .table-striped } From b2a6b4752a96f2b57c9f2935bb35bc0d02c8ad07 Mon Sep 17 00:00:00 2001 From: ahmadlob <109217988+ahmadlob@users.noreply.github.com> Date: Wed, 23 Nov 2022 21:26:30 +0200 Subject: [PATCH 130/280] Taboola Bid Adapter: Remove Dynamic Endpoint Param (#4144) * create new adapter docs for taboola bidder * small fixes * small fixes * Reposition the CSS directive Reposition the styling directive. Split the 'Note' into 2 sections. Make minor textual tweaks. * create new adapter docs for taboola bidder * small fixes * small fixes * Reposition the CSS directive Reposition the styling directive. Split the 'Note' into 2 sections. Make minor textual tweaks. * Update taboola.md disable the support of: schain_supported * update taboola prebid documentation * updating-taboola-adapter-doc-dynamic-url-param * updating-taboola-adapter-doc-dynamic-url-param * remove-endpoint-param * prebid-server-param-add * prebid-server-taboola Co-authored-by: Michael Co-authored-by: pcimring-taboola <57901387+pcimring-taboola@users.noreply.github.com> Co-authored-by: mikiz <31058500+mikizi@users.noreply.github.com> Co-authored-by: jenny.l Co-authored-by: jennylt <48404417+jennylt@users.noreply.github.com> --- dev-docs/bidders/taboola.md | 24 ++++++++++++++---------- 1 file changed, 14 insertions(+), 10 deletions(-) diff --git a/dev-docs/bidders/taboola.md b/dev-docs/bidders/taboola.md index 228279a39f..bf438f9601 100644 --- a/dev-docs/bidders/taboola.md +++ b/dev-docs/bidders/taboola.md @@ -3,6 +3,7 @@ layout: bidder title: Taboola description: Prebid Taboola Bidder Adapter pbjs: true +pbs: true biddercode: taboola gdpr_supported: true usp_supported: true @@ -13,6 +14,9 @@ gvl_id: 42 prebid_member: true floors_supported: true safeframes_ok: true +fpd_supported: false +ortb_blocking_supported: partial +deals_supported: false --- ### Note @@ -27,14 +31,14 @@ The Taboola Adapter requires setup before beginning. Please contact us at prebid {: .table .table-bordered .table-striped } -| Name | Scope | Description | Example | Type | -|---------------|----------|---------------------------------------------------------|----------------------------|--------------| -| `tagId` | required | Tag ID / Placement Name
| `'Below The Article'` | `String` | -| `publisherId` | required | Numeric Publisher ID
(as provided by Taboola) | `'1234567'` | `String` | -| `bcat` | optional | List of blocked advertiser categories (IAB) | `['IAB1-1']` | `Array` | -| `badv` | optional | Blocked Advertiser Domains | `'example.com'` | `String Url` | -| `bidfloor` | optional | CPM bid floor | `0.25` | `Float` | -| `endpointUrl` | optional | Endpoint Url (only if provided by Taboola) | `https://example.com` | `String` | +| Name | Scope | Description | Example | Type | +|-------------------|----------|---------------------------------------------------|-----------------------|--------------| +| `tagId` | required | Tag ID / Placement Name
| `'Below The Article'` | `String` | +| `publisherId` | required | Numeric Publisher ID
(as provided by Taboola) | `'1234567'` | `String` | +| `publisherDomain` | optional | Publisher Domain (server-side adapter only) | `'example.com'` | `String` | +| `bcat` | optional | List of blocked advertiser categories (IAB) | `['IAB1-1']` | `Array` | +| `badv` | optional | Blocked Advertiser Domains | `'example.com'` | `String Url` | +| `bidfloor` | optional | CPM bid floor | `0.25` | `Float` | ### Example Ad Unit @@ -51,10 +55,10 @@ The Taboola Adapter requires setup before beginning. Please contact us at prebid params: { tagId: 'Placement Name', publisherId: 'your-publisher-id', + publisherDomain: 'example.com',// Optional (server-side adapter only) bidfloor: 0.25, // Optional - default is null bcat: ['IAB1-1'], // Optional - default is [] - badv: ['example.com'], // Optional - default is [] - endpointUrl: 'https://example.com' // Optional + badv: ['example.com'] // Optional - default is [] } }] }]; From 698a419811361831c954b1b32285d07ace961932 Mon Sep 17 00:00:00 2001 From: Gino <53079123+Skylinar@users.noreply.github.com> Date: Wed, 23 Nov 2022 20:35:46 +0100 Subject: [PATCH 131/280] smartx Bid Adapter: Add support for Schain (#4154) * initial commit * adjustments * adjustments * adjustments * typo, further adjustments * removed userIds and schain support * Added optionals to outstream and made formatting * Update smartx.md minor edits for clarification and readability. * adjusted outstream_options * remove outstream_function, added pbjs_version_notes * bugfix outstream options for default outstream renderer configuration * refactor descriptions and adding "visibilityThreshold" * Add schain support Co-authored-by: Gino Co-authored-by: Jean Stemp <38964447+jeanstemp@users.noreply.github.com> Co-authored-by: smartclip-adtech <65160328+smartclip-adtech@users.noreply.github.com> --- dev-docs/bidders/smartx.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/dev-docs/bidders/smartx.md b/dev-docs/bidders/smartx.md index c9414be19a..f9c78e8012 100644 --- a/dev-docs/bidders/smartx.md +++ b/dev-docs/bidders/smartx.md @@ -7,7 +7,7 @@ media_types: no-display, video gdpr_supported: true userIds: none prebid_member: true -schain_supported: false +schain_supported: true usp_supported: true safeframes_ok: false pbjs: true From b015bbad3dfac6598f86d28737dd516ce4fa1c61 Mon Sep 17 00:00:00 2001 From: TheMediaGrid <44166371+TheMediaGrid@users.noreply.github.com> Date: Wed, 23 Nov 2022 22:36:25 +0300 Subject: [PATCH 132/280] TheMediaGrid: doc update (#4155) * Added doc file for Grid Bid Adapter * update doc for TheMediaGrid Bid Adapter * Added video support in Grid doc file * removing unnecessary front matter * Update doc file for TheMediaGrid Bid Adapter * Added doc file for TheMediaGridNM Bid Adapter * Update doc file for TheMediaGrid Bid Adapter * Update doc file for The Media Grid Bid Adapter * Update THeMediaGrid doc to support TCF 2.0 * Update doc for TheMediaGrid Bid Adapter * Update doc file for TheMediaGrid Bid Adapter * Update doc for TheMediaGrid Bid Adapter * Update TheMediaGrid doc to support coppa * Update GridNM Bid Adapter doc file * TheMediaGrid: update doc * Added alias playewire for TheMediaGrid Bid Adapter * Added some description in TheMediaGrid doc * Added alias adlivetech for TheMediaGrid Bid Adapter * TheMediaGrid: update doc * TheMediaGrid: update docs for gridNM, grid and aliases to support FPD * TrustX: update doc to support FPD * TheMediaGrid: added native suport for s2s only * TheMediaGrid: remove depricated param keywords Co-authored-by: bretg --- dev-docs/bidders/grid.md | 24 ------------------------ 1 file changed, 24 deletions(-) diff --git a/dev-docs/bidders/grid.md b/dev-docs/bidders/grid.md index c650155d68..32d4762a41 100644 --- a/dev-docs/bidders/grid.md +++ b/dev-docs/bidders/grid.md @@ -32,32 +32,8 @@ fpd_supported: true | Name | Scope | Description | Example | Type | |----------------|----------|-------------------------------------------------------------------------------------------------------------|-------------------------------------------|-----------| | `uid` | required | Represents the MediaGrid bidder system Ad Slot ID associated with the respective div id from the site page. | `1` | `integer` | -| `keywords` | optional | A set of key-value pairs applied to all ad slots on the page. Values can be empty. | `keywords: { topic: ['stress', 'fear'] }` | `object` | | `bidFloor` | optional | Floor of the impression opportunity. If present in the request overrides XML info. | `0.8` | `float` | -Parameter `keywords` must have following format: -``` -{ - "site":{ - "publisher1":[ - { - "name":"SomeKeywordsBlockName", - "segment1Name":[ - "segment2Value" - ], - "segment2Name":[ - "segment2Value1", - "segment2Value2", - ... - ], - ... - } - ], - ... - } -} -``` - ### Bidder Config From 724d829e9f18b6b5b9fc7eaf22a2a99055a0ca07 Mon Sep 17 00:00:00 2001 From: Jason Quaccia Date: Thu, 24 Nov 2022 00:15:15 -0800 Subject: [PATCH 133/280] pbjs.renderAd Doc: Updated to include details about the ${CLICKTHROUGH} macro feature (#4176) * updated docs for ${CLICKTHROUGH} macro with renderAd func * spacing update to md file --- dev-docs/publisher-api-reference/renderAd.md | 15 ++++++++++++++- 1 file changed, 14 insertions(+), 1 deletion(-) diff --git a/dev-docs/publisher-api-reference/renderAd.md b/dev-docs/publisher-api-reference/renderAd.md index f642f845a8..f33d5fd383 100644 --- a/dev-docs/publisher-api-reference/renderAd.md +++ b/dev-docs/publisher-api-reference/renderAd.md @@ -1,6 +1,6 @@ --- layout: api_prebidjs -title: pbjs.renderAd(doc, id) +title: pbjs.renderAd(doc, id, options) description: --- @@ -9,9 +9,22 @@ This function will render the ad (based on params) in the given iframe document **Kind**: static method of pbjs API +`options.clickThrough` optionally enables publishers to count clicks on prebid inventory in their distributing adserver. +The publisher may call renderAd with a third param accepting an object where the value of clickThrough will be checked. +If this property is set the value of clickThrough will replace any occurrence of ${CLICKTHROUGH} inside of the properties ad and adUrl. If no match is found nothing will be replaced. + +{: .alert.alert-info :} +Note: In regards to `options.clickThrough`: +- To make use of this feature, bid adapters would be required to respond with ad tags including the ${CLICKTHROUGH} macro. +- The renderAd function must be invoked with the options argument. Ex: `renderAd(doc, bidId, {clickThrough: 'https://someadserverclickurl.com'});` +- Not compatible with safeframes (since the logic around rendering safeframe's does not invoke the renderAd function). +- Not supported with Prebid Universal Creative at this time, only the standard pbjs.renderAd method. + {: .table .table-bordered .table-striped } | Param | Scope | Type | Description | | --- | --- | --- | --- | | doc | Required | `object` | document | | id | Required | `string` | bid id to locate the ad | +| options | Optional | `object` | object containing other additional params to be used (listed below) | +| options.clickThrough | Optional | `string` | a url used to keep track of clicks on the ad to be rendered (used to resolve the ${CLICKTHROUGH} macro) | From d559e2c9d95c5e568ba0f98fdd5cbc07f699928d Mon Sep 17 00:00:00 2001 From: Jean Stemp <38964447+jeanstemp@users.noreply.github.com> Date: Mon, 28 Nov 2022 07:58:57 -0800 Subject: [PATCH 134/280] New adops overview and planning (#4167) * New adops overview and planning * made requested updates * Updates based on feedback Co-authored-by: Jean Stemp --- _data/sidebar.yml | 203 +++++++++++------- adops/ad-server-integration.md | 64 ++++++ adops/adops-planning-guide.md | 67 ++++++ adops/before-you-start.md | 123 ++--------- adops/creative-considerations.md | 125 +++++++++++ adops/deals.md | 139 +++--------- adops/key-values.md | 109 ++++++++++ adops/line-item-creation.md | 176 +++++++++++++++ adops/price-granularity.md | 181 ++++++++++++++++ adops/send-all-vs-top-price.md | 154 +++++++++++++ .../ad-ops/planning/ad-ops-planning.png | Bin 0 -> 76833 bytes .../planning/pg-line-items-required.png | Bin 0 -> 160738 bytes dev-docs/bidders.md | 2 +- dev-docs/pbs-bidders.md | 2 +- overview/optimal-header-bidding-setup.md | 10 +- 15 files changed, 1050 insertions(+), 305 deletions(-) create mode 100644 adops/ad-server-integration.md create mode 100644 adops/adops-planning-guide.md create mode 100644 adops/creative-considerations.md create mode 100644 adops/key-values.md create mode 100644 adops/line-item-creation.md create mode 100644 adops/price-granularity.md create mode 100644 adops/send-all-vs-top-price.md create mode 100644 assets/images/ad-ops/planning/ad-ops-planning.png create mode 100644 assets/images/ad-ops/planning/pg-line-items-required.png diff --git a/_data/sidebar.yml b/_data/sidebar.yml index 746980ae74..75b1560aec 100644 --- a/_data/sidebar.yml +++ b/_data/sidebar.yml @@ -1190,145 +1190,194 @@ sbCollapseId: ad-ops - sbSecId: 3 - title: Ad Ops Tutorials + title: Overview link: isHeader: 1 - headerId: adopstuts + headerId: adopsoverview + isSectionHeader: + sectionTitle: + subgroup: 0 + +- sbSecId: 3 + title: 'Ad Ops Overview' + link: /adops/before-you-start.html + isHeader: 0 isSectionHeader: 0 - sectionTitle: Ad Ops + sectionTitle: subgroup: 0 - sbSecId: 3 - title: "Prebid" + title: Ad Ops Essentials + link: + isHeader: 1 + headerId: adopsess + isSectionHeader: 0 + sectionTitle: Ad Ops Essentials + subgroup: 1 + +- sbSecId: 3 + title: "Planning" link: isHeader: 0 isSectionHeader: 0 isCatHeader: 1 sectionTitle: - subgroup: 0 + subgroup: 1 - sbSecId: 3 - title: 'AdOps View of Prebid' - link: /adops/before-you-start.html + title: 'Planning Guide' + link: /adops/adops-planning-guide.html isHeader: 0 isSectionHeader: 0 sectionTitle: - subgroup: 0 + subgroup: 1 - sbSecId: 3 - title: 'Prebid Universal Creative' - link: /overview/prebid-universal-creative.html + title: 'Ad Server Integration' + link: /adops/ad-server-integration.html isHeader: 0 isSectionHeader: 0 sectionTitle: - subgroup: 0 + subgroup: 1 - sbSecId: 3 - title: 'Send All Bids' - link: /adops/send-all-bids-adops.html + title: 'Send All Bids vs Top Price' + link: /adops/send-all-vs-top-price.html isHeader: 0 isSectionHeader: 0 sectionTitle: - subgroup: 0 + subgroup: 1 - sbSecId: 3 - title: 'Enable Deals' - link: /adops/deals.html - Item: 1 + title: 'Line Item Creation' + link: /adops/line-item-creation.html isHeader: 0 isSectionHeader: 0 sectionTitle: - subgroup: 0 + subgroup: 1 - sbSecId: 3 - title: "Google Ad Manager" + title: 'Price Granularity' + link: /adops/price-granularity.html + isHeader: 0 + isSectionHeader: 0 + sectionTitle: + subgroup: 1 + +- sbSecId: 3 + title: 'Creative Considerations' + link: /adops/creative-considerations.html + isHeader: 0 + isSectionHeader: 0 + sectionTitle: + subgroup: 1 + +- sbSecId: 3 + title: "Ad Ops Information" link: isHeader: 0 isSectionHeader: 0 isCatHeader: 1 sectionTitle: - subgroup: 0 + subgroup: 1 - sbSecId: 3 - title: 'Guide to Prebid in Ad Manager' - link: /adops/step-by-step.html + title: 'Key Values' + link: /adops/key-values.html isHeader: 0 isSectionHeader: 0 sectionTitle: - subgroup: 0 + subgroup: 1 - sbSecId: 3 - title: 'Setting up for AMP in GAM' - link: /adops/setting-up-prebid-for-amp-in-dfp.html + title: 'Prebid Universal Creative' + link: /overview/prebid-universal-creative.html isHeader: 0 isSectionHeader: 0 sectionTitle: - subgroup: 0 + subgroup: 1 - sbSecId: 3 - title: 'Setting up Multi-Format in GAM' - link: /adops/setting-up-prebid-multi-format-in-dfp.html + title: 'Deals in Prebid' + link: /adops/deals.html isHeader: 0 isSectionHeader: 0 sectionTitle: - subgroup: 0 + subgroup: 1 - sbSecId: 3 - title: 'Setting up Native in GAM' - link: /adops/gam-native.html + title: Ad Server Setup + link: + isHeader: 1 + headerId: adopssetup + isSectionHeader: + sectionTitle: + subgroup: 2 + +- sbSecId: 3 + title: "Google Ad Manager" + link: isHeader: 0 isSectionHeader: 0 + isCatHeader: 1 sectionTitle: - subgroup: 0 + subgroup: 2 - sbSecId: 3 - title: 'Setting up Video in GAM' - link: /adops/setting-up-prebid-video-in-dfp.html + title: 'Guide to Prebid in Ad Manager' + link: /adops/step-by-step.html isHeader: 0 isSectionHeader: 0 sectionTitle: - subgroup: 0 + subgroup: 2 - sbSecId: 3 - title: 'Setting up Long-Form Video in GAM' - link: /adops/setting-up-prebid-ott-video-in-gam.html + title: 'Ad Manager Send All Bids' + link: /adops/send-all-bids-adops.html isHeader: 0 isSectionHeader: 0 sectionTitle: - subgroup: 0 + subgroup: 2 - sbSecId: 3 - title: "Mobile" - link: + title: 'Setting up for AMP in GAM' + link: /adops/setting-up-prebid-for-amp-in-dfp.html isHeader: 0 isSectionHeader: 0 - isCatHeader: 1 sectionTitle: - subgroup: 0 + subgroup: 2 - sbSecId: 3 - title: Setup Native Ads - link: /prebid-mobile/adops-native-setup.html + title: 'Setting up Multi-Format in GAM' + link: /adops/setting-up-prebid-multi-format-in-dfp.html isHeader: 0 isSectionHeader: 0 sectionTitle: - subgroup: 0 + subgroup: 2 - sbSecId: 3 - title: Price Granularity - link: /prebid-mobile/adops-price-granularity.html + title: 'Setting up Native in GAM' + link: /adops/gam-native.html isHeader: 0 isSectionHeader: 0 sectionTitle: - subgroup: 0 + subgroup: 2 - sbSecId: 3 - title: Dr. Prebid Validation App - link: /prebid-mobile/dr-prebid.html + title: 'Setting up Video in GAM' + link: /adops/setting-up-prebid-video-in-dfp.html isHeader: 0 isSectionHeader: 0 sectionTitle: - subgroup: 0 + subgroup: 2 + +- sbSecId: 3 + title: 'Setting up Long-Form Video in GAM' + link: /adops/setting-up-prebid-ott-video-in-gam.html + isHeader: 0 + isSectionHeader: 0 + sectionTitle: + subgroup: 2 - sbSecId: 3 title: "Freewheel" @@ -1337,7 +1386,7 @@ isSectionHeader: 0 isCatHeader: 1 sectionTitle: - subgroup: 0 + subgroup: 2 - sbSecId: 3 title: 'Setting up Long-Form Video' @@ -1345,7 +1394,7 @@ isHeader: 0 isSectionHeader: 0 sectionTitle: - subgroup: 0 + subgroup: 2 - sbSecId: 3 title: "AppNexus Publisher" @@ -1354,7 +1403,7 @@ isSectionHeader: 0 isCatHeader: 1 sectionTitle: - subgroup: 0 + subgroup: 2 - sbSecId: 3 title: 'Setting up Prebid' @@ -1362,17 +1411,16 @@ isHeader: 0 isSectionHeader: 0 sectionTitle: - subgroup: 0 + subgroup: 2 - sbSecId: 3 title: "Smart Ad Server" link: - isHeader: 0 isSectionHeader: 0 isCatHeader: 1 sectionTitle: - subgroup: 0 + subgroup: 2 - sbSecId: 3 title: 'Setting up Prebid' @@ -1380,32 +1428,32 @@ isHeader: 0 isSectionHeader: 0 sectionTitle: - subgroup: 0 + subgroup: 2 - sbSecId: 3 - title: Studies + title: Optimization link: isHeader: 1 - headerId: studies + headerId: optimization isSectionHeader: 0 sectionTitle: - subgroup: 2 + subgroup: 3 - sbSecId: 3 - title: Optimize Header Bidding Setup - link: /overview/how-many-bidders-for-header-bidding.html + title: Analyze Header Bidding Setup + link: /overview/optimal-header-bidding-setup.html isHeader: 0 isSectionHeader: 0 sectionTitle: - subgroup: 2 + subgroup: 3 - sbSecId: 3 - title: An Optimal Setup for Header Bidding - link: /overview/optimal-header-bidding-setup.html + title: Optimize Header Bidding Setup + link: /overview/how-many-bidders-for-header-bidding.html isHeader: 0 isSectionHeader: 0 sectionTitle: - subgroup: 2 + subgroup: 3 - sbSecId: 3 title: Reduce Header Bidding Latency With Prebid.js @@ -1413,15 +1461,7 @@ isHeader: 0 isSectionHeader: 0 sectionTitle: - subgroup: 2 - -- sbSecId: 3 - title: How to Simplify Line Item Setup - link: /overview/how-to-simplify-line-item-setup.html - isHeader: 0 - isSectionHeader: 0 - sectionTitle: - subgroup: 2 + subgroup: 3 #--------------Prebid Video--------------| @@ -1519,7 +1559,7 @@ subgroup: 1 - sbSecId: 4 - title: Integrating Prebid.js with video on your own + title: Integrating Prebid.js with video on your own link: /prebid-video/video-integrating-solo.html isHeader: 0 isSectionHeader: 0 @@ -2356,6 +2396,15 @@ sectionTitle: subgroup: 0 +- sbSecId: 8 + title: Dr. Prebid Validation App + link: /prebid-mobile/dr-prebid.html + isHeader: 0 + isSectionHeader: 0 + sectionTitle: + subgroup: 0 + + #-------------- Prebid Identity --------------| - sbSecId: 9 diff --git a/adops/ad-server-integration.md b/adops/ad-server-integration.md new file mode 100644 index 0000000000..f4ecdb9696 --- /dev/null +++ b/adops/ad-server-integration.md @@ -0,0 +1,64 @@ +--- +layout: page_v2 +title: Ad Server Integration +head_title: Ad Server Integration +sidebarType: 3 +sbUUID: 3.2 +--- + +# Ad Server Integration +{: .no_toc } + +* TOC +{: toc } + +Before you start your Prebid implementation, you need to have signed on with an ad server. As an independent header bidding solution, Prebid was designed to work with any ad server. One step in determining how your integration is going to work is exploring the type of support your ad server has for header bidding and how you’re going to use it. We’re not able to provide details on all ad servers, but we can give you some general information on the most popular ad servers and those the Prebid community has documented. + +Note that not many ad servers currently have native support for header bidding. This is a reminder to check with your ad server to see what they support directly before you move forward. + +{: .alert.alert-success :} +If you want to include information about a particular ad server not documented here, create a PR in our [Github repo](https://github.com/prebid/prebid.github.io). + +## Google Ad Manager +Google Ad Manager (GAM) is currently the most-used ad server. Google is beta testing header bidding support in yield groups, a technology to help publishers manage external integrations. Because header bidding often involved the creation of hundreds or even thousands of line items, yield groups could be a useful option. Here are some things to consider when deciding whether to use GAM yield groups with Prebid: + +- As of this writing, the feature was still in beta testing. +- You must have a GAM premium GAM account to use yield groups. +- The following use cases currently don’t work with yield groups: Native, video, AMP, Post-Bid. Google is open to feedback from the community about these scenarios. +- The Prebid Universal Creative is not utilized. Google has ported some portions of the PUC to an internal creative. +- Not all Prebid bid adapters are supported. +- Aliases are not currently supported, but Google may eventually support aliases that are commonly used. There may also be future updates to support custom aliases. +- Google Publisher Toolkit (GPT) determines bid values using Prebid.js events. +- The yield group should win when the adjusted bid price is higher than the header bidding price bucket, which should typically occur if the publisher is rounding bids down, as is the Prebid default. +- While we haven’t seen any detailed performance testing, we hope that the improved auction dynamics from no longer using price bucketing will have beneficial effects on auction outcomes. + +For step-by-step instructions on using GAM, see the [Google Ad Manager Step by Step](/adops/step-by-step.html). + + +## Other Ad Servers + +We don’t currently have details on specific header bidding support in other ad servers. But practically speaking, these are the requirements to integrate Prebid into an ad server: + +- The ability to pass key-value pairs into the ad call. + + {: .alert.alert-info :} + See the [getAdserverTargeting function](/dev-docs/publisher-api-reference/getAdserverTargeting.html) for engineering instructions on creating whatever format is required. +- The ability to bulk create orders, line items, and creatives (or the equivalent). Since there can be hundreds - or even thousands - of objects to create, it's uncommon for people to create their ad server objects one-by-one. +- The ability to create hundreds or thousands of objects without exceeding ad server limits. + +For step-by-step instructions on using some of the other ad servers, see the following documentation: + +- [Xandr Monetize Ad Server](/adops/setting-up-prebid-with-the-appnexus-ad-server.html) +- [Smart Ad Server](/adops/setting-up-prebidjs-with-Smart-Ad-Server.html) +- [FreeWheel](/adops/setting-up-prebid-video-in-freewheel.html) + +## Next Step + +[Send All Bids vs Top Price](/adops/send-all-vs-top-price.html) + +## Further Reader + +- [Planning Guide](/adops/adops-planning-guide.html) +- [Key Values for Ad Ops](/adops/key-values.html) +- [Prebid Universal Creative](/overview/prebid-universal-creative.html) +- [Deals in Prebid](/adops/deals.html) diff --git a/adops/adops-planning-guide.md b/adops/adops-planning-guide.md new file mode 100644 index 0000000000..ce1e45e6ae --- /dev/null +++ b/adops/adops-planning-guide.md @@ -0,0 +1,67 @@ +--- +layout: page_v2 +title: Ad Operations Planning +head_title: Getting Started with Prebid for Header Bidding +sidebarType: 3 +sbUUID: 3.2 +--- + +# Ad Ops Planning Guide +{: .no_toc } + +* TOC +{: toc } + +There are several decisions you need to make as you’re planning out your Prebid implementation. The following diagram guides you through these decisions. Click on the boxes to navigate to detailed information about each one. (See below for an overview of these options.) + +Ad Ops Decisions + + + Ad Server Integration + Send All Bids vs Top Price + Line Item Creation + Price Granularity + Creative Considerations + + + + +{: .alert.alert-success :} +As you go through the steps, we recommend that you document all your decisions. Many of the decisions will need to be made only once when you first set up Prebid, so good documentation will help you and future users understand the decisions and why they were made. + +## Planning Process + +We’ve presented the decision steps in what we believe is a logical order, but you can go in any order that makes sense to you and your implementation. Here is a brief overview of each step so you can decide where to start. + +[Ad Server Integration](/adops/ad-server-integration.html): Determine what type of support your ad server has for header bidding and whether you want to add that into your configuration. + +[Send All Bids vs Top Price](/adops/send-all-vs-top-price.html): You can choose to send all bids that are received from header bidding demand partners, or send only the top bid. Learn the advantages and disadvantages of each. + +[Line Item Creation](/adops/line-item-creation.html): Here we provide you with some general recommendations and requirements for setting up your line items. + +[Price Granularity](/adops/price-granularity.html): The granularity you want in your line item pricing is dependent on your goals, your workload, and more. Learn how to balance everything to get the outcomes you want. + +[Creative Considerations](/adops/creative-considerations.html): Do you want to work with one universal creative, or have many different creatives? Should you use SafeFrames? These and other questions related to working with creatives are addressed here. + +Some additional resources that might be helpful as you work through your setup include: + +[Key Values for Ad Ops](/adops/key-values.html): Your line item setup is dependent on the key-value pairs the ad server receives in the ad request. Learn what key-value pairs are and how they’re used by Prebid, and the coordination required between ads op and engineering to ensure information gets to and from the ad server correctly. + +[Prebid Universal Creative](/overview/prebid-universal-creative.html): Simplify your line item setup with the Prebid Universal Creative. + +[Deals in Prebid](/adops/deals.html): You can negotiate deals with header bidding demand partners and have them compete with ad server inventory. You’ll need to create additional line items to support these deals. This document explains how to set up Prebid to make that happen. + +## Terminology + +Throughout this planning guide, we use the following terms to describe elements within the ad server. These terms may vary among different ad servers. + +**Order**: A container used to group line items that share similar properties. Orders contain information that applies to all line items attached to that order. Prebid integrations are typically set up with at least one order per bidder. + +**Line Item**: Line items contain the details of each bid, such as price, priority, and media format. Each line item has at least one creative attached. + +**Creative**: A creative is the ad that will be displayed in the ad slot if the associated line item wins the auction. In Prebid, creatives are entered in the ad server as an ad tag (or script) with directions to the actual media that will be displayed. + +**Key Value Pair (KVP)**: Additional parameters sent to the ad server to provide additional targeting or reporting information. Prebid sends keys with associated values that enable the ad server to match a line item to the bid and display the winning creative. A key value pair for a Prebid parameter can include things like the bid price or the name of the bidder. See [Key Values](/adops/key-values.html) for more information. + +## Next Step +[Ad Server Integration](/adops/ad-server-integration.html) diff --git a/adops/before-you-start.md b/adops/before-you-start.md index c00642c581..988dc45acc 100644 --- a/adops/before-you-start.md +++ b/adops/before-you-start.md @@ -6,126 +6,27 @@ sidebarType: 3 sbUUID: 3.2 --- - - # Ad Ops and Prebid {: .no_toc } -Prebid products are designed to integrate with the ad ops line item configuration on the publisher's selected ad server. Whether using Prebid.js, Prebid Server or Prebid Mobile, bid targeting parameters are passed to the ad server. The ad server then attempts to match the targeting parameters to a preset line item. If successful, that line item is compared to other line items and if the Prebid bid wins the auction, the creative is returned to the web page or app for display. - -{% capture importantNote %} -This page assumes you have read [Getting Started with Prebid.js](/overview/getting-started.html), though it applies to Prebid SDK and Server as well. -{% endcapture %} - -{% include alerts/alert_important.html content=importantNote %} - -* TOC -{: toc } - -## Supported ad servers - -The table below lists ad servers supported by Prebid and provides links to step by step documentation for the configurations those ad servers support. - -{: .table .table-bordered .table-striped } -| Server | Page | -|--------------+-----------------------------------------------------------------------------------------------------------------------------------------| -| **Google Ad Manager** | [Step by step guide to Google Ad Manager setup](/adops/step-by-step.html) | -| | [Send all bids to the ad server](/adops/send-all-bids-adops.html) | -| | [Setting up Prebid for AMP in Google Ad Manager](/adops/setting-up-prebid-for-amp-in-dfp.html) | -| | [Setting up Prebid Video in Google Ad Manager](/adops/setting-up-prebid-video-in-dfp.html) | -| | [Setting up Prebid Native in Google Ad Manager](/adops/gam-native.html) | -| **AppNexus** | [Setting up Prebid with the AppNexus Publisher Ad Server](/adops/setting-up-prebid-with-the-appnexus-ad-server.html) | -| **Smart Ad Server** | [Setting up Prebid.js with Smart Ad Server](/adops/setting-up-prebidjs-with-Smart-Ad-Server.html) | -| **FreeWheel** | [FreeWheel Guide for Premium Long-Form Video](/adops/setting-up-prebid-video-in-freewheel.html) | - -## Decide on price bucket granularity - -On a publisher's selected server the ad ops team will need to setup line items. These line items provide targeting information for the ad server, to include the CPM per impression. Prebid will pass in a bid's targeting parameters via key-values. The ad server will read these incoming targeting parameters and search through the line items for a match. - -Example: - -* Prebid.js is going to call your bidders for their price, then pass it into your ad server on the query-string. You want to target this bid price with a line item that earns you the same amount if it serves. - -* If you had 1-line item for every bid at a penny granularity of $0.01, $0.02, $0.03, ..., 1.23, ..., $4.56 you'd need 1,000 line items just to represent bids from $0-$10. We call this the “Exact” granularity option. - -* Creating 1,000 line items can be a hassle, so publishers typically use price buckets to represent price ranges that matter. For example, you could group bids into 10 cent increments, so bids of $1.06 or $1.02 would be rounded down into a single price bucket of $1.00. - -Our recommendation is to start with $1 or 10 cent granularity until you're more comfortable with Prebid.js. At $1, you only need to setup 10-20 line items – easy. When you're ready, get more granular with the price buckets to improve yield. - -{% capture dfpNote %} - -[Google Ad Manager has a limit](https://support.google.com/admanager/answer/1628457?hl=en#Trafficking) of 450 line items per order, which includes archived line items. If you are designing your own granularity setup, make sure you do not exceed that amount. Refer to our recommended pre-configured granularities in Prebid's API reference under the [Set Config Price Granularity instructions](/dev-docs/publisher-api-reference/setConfig.html#setConfig-Price-Granularity). -{% endcapture %} - -{% include alerts/alert_note.html content= dfpNote %} - - -## One set of line items for all bidders vs. a set of line items for each bidder - -### One set of line items for all bidders - -One set of line items for all bidders is the recommended way of setting up your line items. Choose this option if you prefer an easier, low-maintenance setup: - -- It's quicker and easier to setup, because you only have to create one set of line items. -- It's easier to maintain because adding more bidders requires no change to your line item setup. -- It's less error-prone because you only need to maintain 3 keywords: - -{% include default-keyword-targeting.md %} - - -{% capture successNote %} -For instructions on setting up pre-bid with one set of line items for all bidders, see [Send Top Bid to Ad Server - Step by Step guide to Google Ad Manager setup](/adops/step-by-step.html). -{% endcapture %} - -{% include alerts/alert_tip.html content=successNote %} - - -### One set of line items for each bidder - -Choose one set of line items for each bidder if you: - -- Have to rely on line item reporting (not query string reporting) to get winning bid by bidder analytics - - With one set of line items for all bidders, Prebid.js only sends the highest bid to the ad server (the decision logic of choosing the highest bid can be customized by you). This is sufficient if the winning bids matter the most to you. For example, a bidder bidding 100% of time but losing in every auction still has a fill rate of 0%. However, if having access to all bid information is important to you, use one set of line items for each bidder. - -- Require bid landscape data for header bidding partners - - With one set of line items for all bidders, Prebid.js sends the bidder information (Which bidder has the highest price) via a keyword `bidder=bidder_name`. To run a report to attribute winning bids to bidders, you will need to rely on your ad server's keyword reports. Google Ad Manager supports this, but some ad servers do not. Google Ad Manager does not support running reports for more than 2 keywords. Therefore, if you have existing reports that already rely on keywords, and you want to add a winning bid by bidder dimension, use one set of line items for each bidder. - -- Requires setting more keyword targeting within your ad server. The table below lists the required and optional keys for targeting with each of your header bidder partners. - -{% include send-all-bids-keyword-targeting.md %} - -{% capture successNote %} -For instructions on setting up pre-bid with one set of line items for each bidder, see [Send all bids to the ad server - Ad Ops setup](/adops/send-all-bids-adops.html). -{% endcapture %} - -{% include alerts/alert_tip.html content=successNote %} - -## Safeframes - -[SafeFrames are defined by the IAB](https://www.iab.com/guidelines/safeframe/) as a "managed API-enabled iframe that opens a line of communication between the publisher page and the iframe-contained ad creative." +Ad Operations (Ad Ops) are the people who work directly with the ad server software to create, analyze, and update ad campaigns. In companies that use automated processes rather than working directly in the ad server UI, people in Ad Ops define the inputs to the automation that ensure campaigns run as expected. Whatever your actual job title or exact job description, when we refer to “Ad Ops” we’re talking about the non-engineering tasks involved in running and managing ad campaigns. -When setting up line items in your ad server, you'll need to consider whether to make the creatives safeframes or not. In general, for standard banner and native, safeframes are a good idea. Certain special mediatypes cannot use safeframes. +## Ad Ops Role in Prebid -### Bidders known to be incompatible with safeframes +To understand your role in implementing Prebid, you need to understand how header bidding works. You can get a general overview in our [Introduction to Header Bidding](/overview/intro-to-header-bidding.html) and [Introduction to Prebid](/overview/intro.html). But we’re going to provide a few more details here. -{% assign bidder_pages = site.pages | where: "layout", "bidder" | where: "safeframes_ok", false %} -
    -{% for page in bidder_pages %} -
  • {{ page.title }}
  • -{% endfor %} -
+Header bidding is a process for collecting bids for an ad slot before the ad server is called. Those bids and their related targeting information are consolidated and sent along with the ad request to the ad server. -There may be others, please check with bidders directly if you have questions about their support. +When the ad request arrives at the ad server, the ad server reads the targeting information and looks for matching line items. This is where ad ops comes in. You need to ensure that those line items exist and are configured correctly. In order to do that, there are a number of decisions you need to make before you begin your ad server setup. Our [Ad Ops Planning](/adops/adops-planning-guide.html) guide will lead you through these decisions. -## Work together with your dev team +After you’ve completed your planning, move on to the appropriate setup documentation for your ad server. -Implementing header bidding requires much more collaboration with your dev team than normal Ad Ops setup. For example: +- [Google Ad Manager](/adops/step-by-step.html) +- [Xandr Monetize Ad Server](/adops/setting-up-prebid-with-the-appnexus-ad-server.html) +- [Smart Ad Server](/adops/setting-up-prebidjs-with-Smart-Ad-Server.html) +- [FreeWheel](/adops/setting-up-prebid-video-in-freewheel.html) -> Setting up price granularity requires you and the dev team working together to ensure the price buckets match. We have seen cases when the code on page sends $0.10 increments, while the line item setup expects $0.50 increments. This results in the ad server not catching 80% of the bids. -## Related Topics +## Next Step -- [Getting Started with Prebid.js](/overview/getting-started.html): How Prebid.js works at a high level. -- [Prebid.js and Ad Server Key Values](/features/adServerKvps.html) -- [What is Prebid?](/overview/intro.html): Overview and history of header bidding and Prebid.js. -+ [Docs by Format](/dev-docs/docs-by-format.html): Engineering and ad ops docs arranged by ad format (video, native, etc.). +Read the [Ad Ops Planning](/adops/adops-planning-guide.html) guide. diff --git a/adops/creative-considerations.md b/adops/creative-considerations.md new file mode 100644 index 0000000000..b078a16c0d --- /dev/null +++ b/adops/creative-considerations.md @@ -0,0 +1,125 @@ +--- +layout: page_v2 +title: Creative Considerations +head_title: Creative Considerations +sidebarType: 3 +sbUUID: 3.2 +--- + +# Creative Considerations +{: .no_toc } + +* TOC +{: toc } + +Some of the major decisions you need to make as you’re setting up your campaigns have to do with creatives. This document will provide information to help you make those decisions. + +{: .alert.alert-info :} +Throughout this discussion we’re assuming you’ve chosen to use the Prebid Universal Creative (PUC). See [Prebid Universal Creative](#prebid-universal-creative) below for advantages and disadvantages of this approach. For more information on the PUC as well as alternatives, see the [Prebid Universal Creative Overview](/overview/prebid-universal-creative.html). + +## Creatives Overview + +When you set up a line item for a campaign in your ad server, you have to add images or ad tags that will be displayed for that campaign. Header bidding line items have a particular kind of ad tag. + +The Prebid ad tag is entered into creatives on the ad server in the form of a script that will enable Prebid to find the bid that goes with a winning line item. Depending on your ad server, you’ll have to declare your creative as a Third Party creative (Google Ad Manager), or set it to use HTML, or some other means of entering an ad tag (the Prebid script) rather than an image. + +## Prebid Universal Creative + +The first decision you’ll need to make when it comes to creatives (with the exception of VAST video) is whether you want to use the Prebid Universal Creative (PUC). The PUC is a collection of rendering routines that can pull a particular ad ID from the Prebid cache and do the right thing to display it. You can find full details about the PUC in the [Prebid Universal Creative Overview](/overview/prebid-universal-creative.html). For now we’ll focus on the advantages and disadvantages to using the PUC. + +The big advantage to using the PUC is that it’s the simplest approach to configuring Prebid in your ad server. It provides a robust mechanism that can be used across several formats, platforms, devices, and ad servers. + +The primary disadvantage to using the PUC is that it takes an extra fetch to load the PUC file vs doing everything inline to the creative. Also, in version 1.14.1 and earlier of the PUC, loading a “universal” creative means that more bytes are loaded than are actually necessary for the display of a single creative. This all leads to a very slight performance penalty. + +You’ll need to determine whether the ease of implementation is worth the small performance penalty. + + +## Creative Naming + +You can name your creatives whatever makes sense to your organization. We recommend names in the following format: Prebid - Type - Size - N. For example, a banner creative using the PUC would be `Prebid - banner - 1x1 - 1`. + +## Creative Modes + +No matter what type of media you’re working with, you need to decide how you’re going to represent the size options in the ad server. There are three creative size modes: + +- Creatives are all sized 1x1 +- Creatives are sized their actual size +- Line items are targeted per size + +### All Creatives 1x1 + +If you select this mode, in the ad server you’ll set the size of all your Prebid creatives to 1x1. The creatives will then be resized based on the value supplied by the demand partner in the hb_size key. This is the simplest option to implement and requires the fewest number of creatives to be created. + +If you’re working with Google Ad Manager (GAM) we recommend you create one general 1x1 creative, then duplicate it to attach 3 - 5 identical creatives to each line item. The reason for this is that GAM doesn’t make a distinction between creatives with images attached and creatives with a script that could be used to retrieve one of many different images. It treats every creative as an individual image, and allows each one to be served to only one ad unit per page. + +For Prebid line items, this means that if your page has multiple ad slots that fit the same line item targeting, GAM would allow only one of them to display the creative, not realizing that one creative could point to different images. Attaching multiple identical creatives to each line item ensures that creatives from a line item matching the targeting on multiple ad slots can serve on the same page. + +For example, say you're using "low" granularity, which means that one line item covers bids from $1.00 to $1.49. If you have three creatives associated with that line item, the page could not display anymore than three Prebid bids in that price range. If you have infinite scroll pages, you'll have to consider the tradeoff for how many copies of creatives you want to have. + +### Creative Actual Size + +With this mode, you set specific sizes on the creatives. This mode allows for more precise reporting if you’re interested in knowing the exact sizes of creatives being served from Prebid. As with the 1x1 option, we recommend you create 3 - 5 duplicate creatives of each size. The downside is that this requires a lot of creatives per line item. If you specify 20 sizes, you would need as many as 100 duplicate creatives. + +### One Line Item Per Size + +We recommend against using this mode, but are aware some publishers use it for reporting purposes. With this mode, you would target your line item based on the value of the hb_size key. This would require you to create one line item for every size, for every bidder, for every price. The number of line items required could get extremely large. Here’s an example (see [Price Granularity](/adops/price-granularity.html) for more details): + +- Bidders: 10 +- Price Increment: 0.10 +- Price Cap: 20 +- Sizes: 5 +- Send all bids + +This scenario would require you to create 10,000 line items (10 x 200 x 5). If you were to use either 1x1 mode or creative-level sizing you would need only 2,000 line items. + +## Banner and Outstream Creatives + +As we mentioned, each creative requires an ad tag script that will call the [Prebid Universal Creative](/overview/prebid-universal-creative.html) to display the correct image. + +One decision you'll want to make is which version of the PUC you want to use. Prebid hosts a copy, which you're free to use. But some publishers might want to use their own copy of the PUC so as to have greater control over the upgrade windows. + +{: .alert.alert-info :} +Engineers can find the PUC code in the [Prebid Github repository](https://github.com/prebid/prebid-universal-creative). + +## Native +Native ads require close collaboration between web designers, engineering, and ad ops. The primary decision to be made that affects ad ops is where to store the rendering template. Your options are: + +- The ad server +- The page's Prebid.js adunit +- An external script + +If you already have templates stored in your ad server for some native ads, it might make sense to also store the templates for Prebid there and keep everything together and consistent. This also gives ad ops control over when templates change. + +The second two options require engineering to make any changes when template updates are required. Because native ad formatting is tied to the look of the site, these options could fit in with normal site maintenance. + +Each option requires a different PUC ad tag to be used in the associated creatives, so be sure to get the correct script (and CSS file) from the engineers. + +{: .alert.alert-info :} +Engineering details outlining each template storage option can be found in the [Prebid.js Native Implementation Guide](/prebid/native-implementation.html). + +## VAST Video +VAST video (instream and long-form video) does not use the PUC. Instead, video bids provide VAST that Prebid caches to obtain a cache ID that can be retrieved with a URL. The cache ID is passed as a key value to the ad server. (See [Video Overview](/prebid-video/video-overview.html) for details.) + +When you’re running campaigns with video creatives, the primary decision you need to make is where to cache your video bids. You’ll enter this location in the creative you add to the line item. The cache location is typically independent of the bidders. The most common cache location is https://prebid.adnxs.com. See [Setting Up Video In GAM](/adops/setting-up-prebid-video-in-dfp.html) for detailed instructions on configuring a video creative in GAM. + +## SafeFrames + +Another decision you need to make with regards to banner and native creatives is whether to run them in SafeFrames. A SafeFrame is defined by the IAB as “a managed API-enabled iframe that opens a line of communication between the publisher page and the iframe-contained ad creative.” SafeFrames provide an added layer of security by separating the ad from your web page. + +We recommend using SafeFrames for banner and native creatives, but there are some things to keep in mind if you do this. For example: + +- Some creatives, such as richmedia formats, can’t render in SafeFrames. +- Some bidders do not support the use of SafeFrames. + +If you don't trust all your bidders to provide creatives that can safely run inside of SafeFrames, then you'll want to consider using [Send All Bids](/adops/send-all-vs-top-price.html) (the default), which will enable you to allow some bidders to use SafeFrames and some not. + +[Prebid documentation for each bidder](/dev-docs/bidders.html) provides information on whether the bidder supports SafeFrames. + +Be sure to check with bidders directly if you have questions about their SafeFrame support. + +## Further Reader + +- [Planning Guide](/adops/adops-planning-guide.html) +- [Key Values for Ad Ops](/adops/key-values.html) +- [Prebid Universal Creative](/overview/prebid-universal-creative.html) +- [Deals in Prebid](/adops/deals.html) diff --git a/adops/deals.md b/adops/deals.md index f2c838e137..61c6d0d703 100644 --- a/adops/deals.md +++ b/adops/deals.md @@ -1,135 +1,60 @@ --- layout: page_v2 -title: Enable Deals -head_title: Enable Deals in Prebid for Header Bidding -description: Enable Deals in Prebid for Header Bidding Analysis. -pid: 4 - +title: Deals in Prebid +head_title: Deals in Prebid sidebarType: 3 +sbUUID: 3.2 --- -# Enable Deals in Prebid -{:.no_toc} - -In order to enable deals for prebid, the ad ops setup is slightly different from the standard header bidding setup. Specifically: - -+ From the ad ops side, you'll create separate orders and line items that target the deal ID key-values. These line items will be at different (probably higher) priorities than your standard header bidding line items. - -+ From the dev side, if your page is using the standard prebid.js key-values, no change or work is required. - -{: .bg-info :} -In this example we will use the Google Ad Manager setup to illustrate, but the steps are basically the same for any ad server. +# Deals in Prebid +{: .no_toc } * TOC -{:toc} - -### Step 1: Understand Key-values - -Whenever a bidder responds with a bid containing a deal ID, Prebid.js will generate and attach deal-related key-values to the ad server call in the format: `hb_deal_BIDDERCODE = DEAL_ID`. - -For example, given the submitted bids, prices, and deals shown here: - -``` -bid 1: Bidder = Rubicon, CPM = 1.50, Deal ID = RBC_123 -bid 2: Bidder = AppNexus, CPM = 1.20, Deal ID = APN_456 -``` - -The key-values attached to the ad server call (that the line items will target) will be: - -``` -hb_pb_rubicon = 1.50 -hb_deal_rubicon = RBC_123 -hb_pb_appnexus = 1.20 -hb_deal_appnexus = APN_456 -// hb_adid, hb_size, and hb_adid omitted -``` - -{% capture noteAlert %} -We recommend confirming with your development team that the page is set up to send all deal targeting to the ad server. There are two ways to do this: -- Set the `enableSendAllBids` to **true**. -- Set `enableSendAllBids` to **false** and `alwaysIncludeDeals` to **true**. This option will minimize the number of targeting variables sent to the ad server. -See the [enableSendAllBids](/dev-docs/publisher-api-reference/setConfig.html#setConfig-Send-All-Bids) documentation for details. -{% endcapture %} - -{% include alerts/alert_note.html content=noteAlert %} - -
- -### Step 2: Create Key-values - -For each header bidding partner you work with, create a keyword in the format of `hb_deal_BIDDERCODE`, e.g., `hb_deal_pubmatic`. For more examples of the keyword format, see the [API Reference for `pbjs.getAdserverTargeting`](/dev-docs/publisher-api-reference/getAdserverTargeting.html). - -
- -![Inventory Sizes]({{ site.github.url }}/assets/images/demo-setup/deals/key-val.png){: .pb-lg-img :} - -
- -### Step 3: Create Line Items for Deals - -In Google Ad Manager, create a new line item. - -Enter all the **Inventory sizes** for your deal (or deals): - -![Inventory Sizes]({{ site.github.url }}/assets/images/demo-setup/inventory-sizes.png){: .pb-md-img :} +{: toc } -
-Set the **priority** to the level you prefer. +In the same way that you can negotiate deals with advertisers in your ad server, you can also set up deals with your header bidding partners. When you do that, there are just a few things to keep in mind to ensure those deals get sent to the ad server and your line items are prepared to receive them. -![Inventory Sizes]({{ site.github.url }}/assets/images/demo-setup/deals/deal-priority.png){: .pb-lg-img :} +## Send Deal to Ad Server -
+In [Send All Bids vs Top Price](/adops/send-all-vs-top-price.html) we described those two options for sending bids to the ad server. There is also a third option created specifically for deals: Send top price and deals. -Set **Display Creatives** to *One or More* since we'll have one or more creatives attached to this line item. +### Deals with Send All Bids -Set **Rotate Creatives** to *Evenly*. +If you send all bids to the ad server, deals will be sent along with the rest of the bids. If you want your deals to be prioritized over the rest of the bids, be sure to inform the software engineers so they can configure Prebid for this scenario. -![Display and Rotation]({{ site.github.url }}/assets/images/demo-setup/display-and-rotation.png){: .pb-md-img :} +{: .alert.alert-info :} +See [Configure Send Bids Control](/dev-docs/publisher-api-reference/setConfig.html#configure-send-bids-control) for engineering instructions on this configuration. -
+### Deals with Send Top Price -Then you'll need to target the **inventory** that you want to this deal to run on. +If you decide to send only the top price bid, the deal might not be the top price, in which case it would not be sent and the ad server would never see it. To ensure deals make it to the ad server, the software engineers need to know that deal bids should be included along with the top priced bid. They can then configure Prebid to send both the top price and any deals that come through. -
+{: .alert.alert-info :} +See the [Send All Bids engineering reference](/dev-docs/publisher-api-reference/setConfig.html#setConfig-Send-All-Bids) for engineering instructions on sending deals along with the top bid. -**Use Key-values targeting to target deal ID(s)** +## Deal Line Item Details -There are two ways to target deal IDs using *Key-values* targeting: +In [Line Item Creation](/adops/line-item-creation.html) we talked about some requirements and recommendations for setting up line items for Prebid. You can follow most of those settings for deals, with the modifications outlined here. -1. If you would like the deals to have the same priority and target the same inventory, you can include multiple deal IDs (as shown below). -2. Otherwise, you must create a separate line item for each deal ID you want to target. +### Deal Key Value Pairs -![Inventory Sizes]({{ site.github.url }}/assets/images/demo-setup/deals/targeting.png){: .pb-lg-img :} +From the ad server side, you need to create special line items for each deal. This is done through a key-value pair. (See [Key Values](/adops/key-values.html) for details on how key value pairs work.) -
+For each header bidding partner you negotiate deals with, create a keyword in the format hb_deal_BIDDERCODE, e.g., hb_deal_BidderA. Then when you create the line item for the deal, add in that code with the associated deal ID. For example, hb_deal_BidderA=BDA_123. -### Step 4: Attach Creatives to Line Items +{: .alert.alert-info :} +The actual value of the deal ID (BDA_123 in this example) will be obtained from the demand partner. -Like all line items, those that represent deals need to be associated with creatives that pass the correct adid back to Prebid.js for display. +### Start and End Dates -e.g. if the line item is targeted to `hb_deal_pubmatic`, then the creative needs to send `hb_adid_pubmatic` in the creative. Like this: +Prebid line items normally start immediately with no end date; the line item exists to receive a bid at any time, whenever it gets sent to the ad server. Because deals are negotiated with the demand partner, deals will have date ranges in accordance with the agreement. - - +## Further Reader -If however, the line item is targeted to `hb_deal` (without a bidder code), -then the simplified creative setup in the [step-by-step instructions](/adops/step-by-step.html#step-2-add-a-creative) will be fine. +- [Planning Guide](/adops/adops-planning-guide.html) +- [Key Values for Ad Ops](/adops/key-values.html) +- [Prebid Universal Creative](/overview/prebid-universal-creative.html) diff --git a/adops/key-values.md b/adops/key-values.md new file mode 100644 index 0000000000..bfe82a0a2a --- /dev/null +++ b/adops/key-values.md @@ -0,0 +1,109 @@ +--- +layout: page_v2 +title: Key Values +head_title: Key Values +sidebarType: 3 +sbUUID: 3.2 +--- + +# Key Values +{: .no_toc } + +* TOC +{: toc } + +Prebid uses key-value pairs to pass bid information to the ad server. This puts key values at the core of how Prebid works. Without key values, Prebid would have no way of communicating with ad servers, and therefore no way to make header bidding part of the auction. This document explains how bid information is sent to the ad server, what information is sent, and options for modifying the amount and types of information that is sent. + +## Sending Bids to the Ad Server + +Prebid sends information to the ad server about the bids it receives by creating a query string of key-value pairs (KVPs) and attaching it to the ad request that is sent to the ad server. A portion of that query string might look something like this: + +`?hb_pb=1.50&hb_adid=234234&hb_bidder=bidderA` + +In this example, hb_pb is the bid price bucket (1.50), hb_adid is an identifier for the specific bid (234234), and hb_bidder is the name of the bidding SSP or exchange (bidderA). In order for a bid that comes from the header bidding process to compete with bids on the ad server, you must have line items set up with key values that match the KVPs in the query string. + +## Prebid Keys + +This table lists the keys that can be sent from Prebid to the ad server. Depending on the media type, most of these keys are sent by default. + +{: .alert.alert-info :} +You can work with your engineers to modify the default list. See [Restricting Data Sent to the Ad Server](#restricting-data-sent-to-the-ad-server) below for more information. + +{: .table .table-bordered .table-striped } +| Key | Usage | Scenario | Description | Example Value | +| --- | ----- | -------- | ----------- | ------------- | +| hb_pb | targeting | All | The bid price bucket (adjusted for price granularity). | 2.10 | +| hb_adid | rendering | All | The ad ID. Used by the Prebid Universal Creative (PUC) ad server creative to render the winning Prebid ad. | 123456 | +| hb_bidder | targeting and reporting | Could be used for creative-level targeting in video scenarios; reporting for all scenarios | The bidder code. Used for logging and reporting to learn which bidder has higher fill rate/CPM. | BidderA | +| hb_size | rendering | Banner, native, outstream. Not used for video. | The size used for resizing the iframe for the winning creative. | 300x250 | +| hb_format | targeting and reporting | Needed only if there's a different set of line items for different media types | Used when creating a separate set of line items for banner vs video | video | +| hb_deal | targeting | All | Target private marketplace deals | 7777777 | +| hb_uuid | rendering | Video only | Carries the cache retrieval ID for VAST video creatives | 1111-2222-3333-4444 | +| hb_cache_id | rendering | Banner, native, outstream; mobile app only | Carries the cache retrieval ID for mobile bids | 2222-3333-4444-5555 | +| hb_cache_host | rendering | Banner, native, outstream; mobile app only | The host where the cached creative lives | https://mycachehost.example.com | +| hb_cache_path | rendering | Banner, native, outstream; mobile app only | The web path where the cached creative lives | /cache | +| hb_source | reporting | Server-to-server testing | Used to report the A/B test results for client- vs server-side performance. | s2s | +| hb_adomain | reporting and special | All | Used to report on VAST errors, set floors on certain buyers, monitor volume from a buyer, or track down bad creatives | example.com | + + +When you’re sending the [Top Price Bid](/adops/send-all-vs-top-price.html) to the ad server, the preceding keys are the only keys that will be sent. If you’re [Sending All Bids](/adops/send-all-vs-top-price.html), the preceding keys will be sent, plus the same set of keys specific to each bidder, with the bidder name appended. For example, if you receive bids from BidderA and BidderB, the keys hb_pb, hb_pb_BidderA, and hb_pb_BidderB will all be sent to the ad server with the values provided by the associated bidders. (Even in that scenario, the "winning" keys [hb_pb, etc.] will still have the values for the top bid.) + +## Key Value Pair Usage + +KVPs sent from Prebid are used in the ad server for a variety of purposes: targeting, reporting, creative rendering, and to supply additional information. + +### Targeting + +Targeting KVPs are used to pick out which line items match the request, or possibly which creative within a line item should be used. They will need to be entered in the line items you create to capture the bids coming in from Prebid. These key values can also be used in reports. + +{: .alert.alert-success :} +It's also possible to use regular ad server targeting values on header bidding line items. For example, if you want to have different price granularities in one country, you could create multiple sets of line items differentiated by country. + +### Reporting + +Some publishers rely on ad server KVPs for important business reporting. Reporting on the Prebid keys can help you determine the performance of your header bidding partners and your overall Prebid configuration. Key values that are for reporting only are not entered in line items. Depending on your ad server, reporting keys might need to be created in the ad server in order to be used in reporting. + +### Rendering + +These values are needed for rendering the creative properly when the Prebid line item is chosen. + +### Special Usage + +The hb_adomain key was created to provide additional information about a bid or to help with troubleshooting. See [setConfig](/dev-docs/publisher-api-reference/setConfig.html#details-on-the-allowtargetingkeys-setting) for engineering information on using the hb_adomain key. + + +## Restricting Data Sent to the Ad Server + +When Prebid creates the query string that is sent to the ad server, it includes a default set of keys (along with the associated values provided by the demand partners). However, you might not need or want all the default values, or maybe you need additional values. Because of this, Prebid provides tools that allow for modifications to the amount of data sent to the ad server. + +You’ll need to determine which keys you want sent and then work with your engineers to ensure the keys that are sent match those you’re expecting. Some things to consider: + +How much information do you need and want? +Does your ad server have restrictions on the amount of data it can receive? + +### Key Values in Your Configuration + +The information you need and want are entirely dependent on your configuration and usage requirements. Maybe not all the reporting keys are useful to you, in which case you can omit some or all of those keys. Making sure the keys you need match the keys that are sent to the ad server will help ensure the targeting and reporting you’ve set up on your ad server work correctly. + +### Query String Restrictions + +Some ad servers restrict the number of characters they’ll accept on the query string. When you use [Send All Bids](/adops/send-all-vs-top-price.html), the number of key value pairs sent to the ad server can be very large, depending on the number of bidders and ad slots.This large number of key value pairs can make for a very long query string. + +If the query string has too many characters, an ad server with restrictions could simply truncate the string to the length it will accept. This could prevent bids from being received, or could truncate a bidder’s key values to the point where they won’t match any line items. Fortunately, Prebid can be configured to deal with this issue. + +In addition to being able to specify which keys to send, Prebid can also be configured to limit the length of the query string that will be appended to the ad request. Prebid will prioritize the bids to ensure top bids and deals are included, along with all of their associated key value pairs. + +{: .alert.alert-info :} +For details on how Prebid prioritizes bids based on query string length, see “Details on the auctionKeyMaxChars setting“ under [Configure Targeting Controls](/dev-docs/publisher-api-reference/setConfig.html#setConfig-targetingControls). + +Reducing the number of default keys sent and limiting the number of bidders will reduce the length of the query string. Work with your engineers to evaluate the typical length of your query strings and make modifications as necessary to achieve the best results for your organization. + +{: .alert.alert-info :} +For engineering information on configuration options, see [Prebid.js Controls](/features/adServerKvps.html#controls). In particular, note the following: + [Configure Targeting Controls](/dev-docs/publisher-api-reference/setConfig.html#setConfig-targetingControls). + +## Further Reader + + - [Planning Guide](/adops/adops-planning-guide.html) + - [Prebid Universal Creative](/overview/prebid-universal-creative.html) + - [Deals in Prebid](/adops/deals.html) diff --git a/adops/line-item-creation.md b/adops/line-item-creation.md new file mode 100644 index 0000000000..8216b04e56 --- /dev/null +++ b/adops/line-item-creation.md @@ -0,0 +1,176 @@ +--- +layout: page_v2 +title: Line Item Creation +head_title: Line Item Creation +sidebarType: 3 +sbUUID: 3.2 +--- + +# Line Item Creation +{: .no_toc } + +* TOC +{: toc } + +The settings you apply when creating line items to capture bids coming in from the header bidding process are typically different from those you apply when creating line items for house ads. This document will walk you through some of the differences, and outline requirements and recommendations for creating line items to work with Prebid. + +{: .alert.alert-success :} +Manually configuring ad server elements for Prebid can be a fair amount of work. If you’re using Google Ad Manager (GAM), consider using our official command line tool, [Prebid Line Item Manager](/tools/line-item-manager.html#prebid-line-item-manager.html), to create the setup. Using this tool may save you time and help you avoid mistakes. + +## Advertisers and Orders + +Line items (and creatives) must, at some level, be associated with advertisers. When you create line items to capture Prebid bids, you won’t know who the actual advertisers are. Instead you need to create generic advertisers in your ad server that are used for Prebid. For example, you can create an advertiser named “Prebid Advertiser.” Or if you’re using Send All Bids, you can create one advertiser per bidder, such as “Prebid BidderA,” “Prebid BidderB,” etc. You then associate your line items and creatives with those advertisers. + +Depending on your ad server, line items are typically grouped within orders under each advertiser. + + +## Line Item Details + +You have many options for the way in which you set up your line items. The following are Prebid requirements, and also some recommendations, to ensure bids are captured correctly and to make keeping track of your header bidding line items easier. + +### At a Glance + +These tables show the Prebid line item recommendations and requirements. The following sections provide more details on each. + +**Required** + +{: .table .table-bordered .table-striped } +| Detail | Requirement | +| ------ | ----------- | +| Line Item Type | Price Priority (depending on your ad server) | +| Key Value Pricing | Include the number of decimal places that are defined in the price granularity precision. Normally this is two decimal places, e.g. hb_pb=0.50 or hb_pb=1.00 | + +**Recommended** + +{: .table .table-bordered .table-striped } +| Detail | Recommendation | +| ------ | -------------- | +| Line Item Groups | Determine the number of containers you'll need to store the line items based on price granularity, number of bidders, and ad server restrictions. Name your group in the format Prebid, format, bidder name (for [Send All Bids](/adops/send-all-vs-top-price.html)), and unique number; for example, `Prebid - banner - BidderA - 1`. | +| Line Item Name | Name each line item for the header bidding price bucket. Use the naming pattern Prebid, mediatype, bidder (for Send All Bids), and price bucket; for example, `Prebid - banner - BidderA - 1.50`. | +| Creative Name | In the creative name, include Prebid, the media type and the size (if applicable), and a unique identifying number (if more than one creative of a given size is attached to the line item). If using Send All Bids, also include the bidder name; for example, `Prebid - banner - BidderA - 1x1 - 1`. | +| Start and End Dates | Start immediately, no end date | +| Priority | Above house ads but below directly sold ads | +| Impression Goal | None | +| Media Types | Group media types by price granularity. This typically means you can group banner, outstream video, and native together but video will be a separate set of line items. | + +### Line Item Type + +If your ad server supports it, you should set your line item type to Price Priority, which will let it compete with bids from other sources. + +### Key Value Pricing + +When you enter your key values for price, you must include the number of digits following the decimal point that are specified with your [price granularity](/adops/price-granularity.html). This is known as the precision value. For example, if Prebid is configured with a precision of two decimal places, then when you enter a value for the key hb_pb you must include two decimal places in your value: 0.50 or 1.00 rather than 0.5 or 1. If you don’t include the correct number of decimal places, your line item will not match any header bidding values. + +For predefined Prebid price granularities the precision is 2; for custom price granularities this value can be defined in your Prebid configuration. + +{: .alert.alert-info :} +Engineering instructions for setting the precision value can be found in [setConfig Price Granularity](/dev-docs/publisher-api-reference/setConfig.html#setConfig-Price-Granularity). + +See [Key Values](/adops/key-values.html) for general information about key value pairs. + +### Line Item Groups + +If you are [sending all bids](/adops/send-all-vs-top-price.html) to the ad server, you’ll most likely want to group your line items by bidder. (In Google Ad Manager this means creating at least one set of orders per bidder, with that bidder’s line items attached to the order.) This allows each group to have a set of line items that use the same targeting keywords, all of which include the bidder’s name. For example, if you are working with BidderA, all line items within a group would use the key hb_pb_BidderA in the line item’s key-value targeting, and hb_adid_BidderA in the attached creative. + +Depending on your ad server and the number of line items you’re creating, you might need more than one group per bidder. For example, suppose you need to create 2000 line items for one bidder. If GAM is your ad server, you’re allowed only 450 line items per order, so you will need five orders per bidder to store the 2000 line items, for a total of 25 orders. + +We recommend naming the group to include “Prebid”, media type, the bidder name, and also a number or other identifier if you need more than one group per bidder. For example, `Prebid - banner - BidderA - 1`. For [Send Top Price Bid](/adops/send-all-vs-top-price.html) you can omit the bidder name: `Prebid - banner - 1`. + +### Line Item Name + +Because you’ll be creating one line item per price within each [price bucket](/adops/price-granularity.html), it’s helpful to name your line items based on the price. It can also be helpful to include the mediatype, since different types of media could be priced the same. Some examples include `Prebid - banner - 1.00`, `Prebid - video - 1.50`, etc. If you’re [sending all bids](/adops/send-all-vs-top-price.html), include the bidder code: `Prebid - banner - BidderA - 1.00`, `Prebid - banner - BidderA - 1.50`. + +### Creative Name + +We recommend naming creatives to include the media type, size (where applicable), and a number if there is more than one. For example, `Prebid - banner - BidderA - 1x1 - 1`; `Prebid - video - BidderA - 1`. + +### Start and End Dates + +With header bidding, start and end dates of the actual ad campaigns are controlled by the header bidding demand partners. The demand partners check their inventory and bid for an ad slot based on campaigns running on their systems. The line items you’re creating are generic and immortal line items created to capture a bid from a campaign your demand partner will be running at some point in the future. + +What this means is that you typically don’t want to include an end date in your line items. Your line item will always be active to read in bids coming from your demand partner. + +Set your start date to begin immediately. + +### Priority + +Unless you’re working with [deals](/adops/deals.html), bids received from header bidding will typically have a priority lower than directly sold ads but higher than any competing house ads. + +### Impression Goal + +We recommend you do not set an impression goal. Because these are general line items with (typically) no end date, there’s no need to set a goal. + +### Media Types + +Prebid supports many media types, and you can set up a single line item with multiple types. The media types you choose can impact the way in which you decide to organize your line items. + +Grouping media types within line items is typically dictated by the pricing structure: + +- Banner, outstream video, and native generally run together because they have similar pricing expectations and therefore can share [price granularities](/adops/price-granularity.html). +- Instream video is normally created as a separate set of line items because they are usually priced higher than other formats, often requiring custom price granularity. + +You must set a key value for each format used by an ad unit using the hb_format (or hb_format_BIDDER) key and setting its value to the appropriate format. For example, if the ad unit is set up as a banner ad, you would target hb_format=banner (along with the price, such as hb_pb=1.00). If your ad unit supports multiple types, set the key value to include all types: `hb_format` in `banner`,`native`. + +## Example Line Item Setup + +Here's an example that encapsulates a number of the key decisions outlined in this document. In this scenario, we’ve made the following decisions: + +- Send Top Bid +- Banner granularity: high +- Video granularity: custom +- Order naming pattern: Prebid - banner - N, Prebid - video - N +- Line Item naming pattern: Prebid - banner - PRICE, Prebid - video - PRICE +- Creative naming pattern: Prebid - banner - 1x1 - N, Prebid - video - N +- Choosing to make three copies of each creative + +The granularity we’ve chosen means we’ll be creating 2000 line items for banner and 1000 line items for video. Those line items will be named as shown here: + +- Order: Prebid - banner - 1 + - LI: Prebid - banner - 0.00 (If the bid is less than 1 penny, it rounds down to 0, but is still worth something) + - Creative: Prebid - banner - 1x1 - 1 + - Creative: Prebid - banner - 1x1 - 2 + - Creative: Prebid - banner - 1x1 - 3 + - LI: Prebid - banner - 0.01 + - ... creatives ... + - LI: Prebid - banner - 0.02 + - LI: Prebid - banner - 0.03 + - ... + - LI: Prebid - banner - 4.49 +- Order: Prebid - banner - 2 + - LI: Prebid - banner - 4.50 + - LI: Prebid - banner - 4.51 + - LI: Prebid - banner - 4.52 + - LI: Prebid - banner - 4.53 + - ... + - LI: Prebid - banner - 09.49 +- ... other banner orders up to 20.00 ... + +- Order: Prebid - video - 1 + - LI: Prebid - video - 0.00 + - Creative: Prebid - video - 1 + - Creative: Prebid - video - 2 + - Creative: Prebid - video - 3 + - LI: Prebid - video - 0.05 + - LI: Prebid - video - 0.10 + - ... +- ... + +If we had chosen Send All Bids (the Prebid default), every element shown above would be recreated for each bidder, and each name would include the bidder name. For example: + +- Order: Prebid - banner - BidderA - 1 + - LI: Prebid - banner - BidderA - 0.00 + - Creative: Prebid - banner - BidderA - 1x1 - 1 + - Creative: Prebid - banner - BidderA - 1x1 - 2 + - Creative: Prebid - banner - BidderA - 1x1 - 3 +- ... + +## Next Step + +[Price Granularity](/adops/price-granularity.html) + +## Further Reader + +- [Planning Guide](/adops/adops-planning-guide.html) +- [Key Values for Ad Ops](/adops/key-values.html) +- [Prebid Universal Creative](/overview/prebid-universal-creative.html) +- [Deals in Prebid](/adops/deals.html) diff --git a/adops/price-granularity.md b/adops/price-granularity.md new file mode 100644 index 0000000000..9cab9519e1 --- /dev/null +++ b/adops/price-granularity.md @@ -0,0 +1,181 @@ +--- +layout: page_v2 +title: Price Granularity +head_title: Price Granularity +sidebarType: 3 +sbUUID: 3.2 +--- + +# Price Granularity +{: .no_toc } + +* TOC +{: toc } + +Price granularity is a way to quantize bids so that you don't need to make an infinite number of line items. It allows you to balance the work of creating line items with the desire to optimize revenue from your header bidding partners. This document will explain price granularity in detail and why it’s necessary, and provide you with the information you need to make the best decisions for your Prebid implementation. + +## Price Granularity Explained + +When your ad server looks to fill an ad request, it takes many things into consideration. Broken down to its simplest form, we can say that the highest price that matches the targeting will win the auction for the ad slot. In a non-header bidding scenario, when you set up line items for your advertisers in your ad server, you specify the amount of money the advertiser is willing to spend for a particular ad unit based on whether it matches the targeting. For example, an advertiser might be willing to pay 1.52 CPM for an ad unit that targets people aged 18 - 25 who live in the U.S. So you set up your line item for that advertiser with a rate of 1.52 CPM. + +With header bidding, you have bids coming in from outside the ad server, so you don’t have any price information until the actual bid is passed into the ad server. Instead, it works like this: + +- Prebid contacts your demand partners, who find advertisers running campaigns that match the available contextual and user information. +- The demand partners send in their top bid or bids for the ad slot. +- Those bids are then sent to your ad server. + +With this process, you don’t know in advance what price your demand partner’s advertisers were willing to pay. So how do you know what price to target in your line items? Do you have to create a line item for every possible price that could come in? Given the fact that open market bids can be fractions of units (so a bid of 0.255 is acceptable), the number of line items you would have to create to cover every possibility is almost infinite. + +This is where price granularities come in. Price granularities allow you to group bids into “price buckets.” These buckets give you a definitive set of bid prices to target, and therefore a definitive set of line items to create. + +## Components of Price Granularity + +In Prebid, there are four components to price granularity. + +**Price increments**: The increments between prices you’ll be targeting in your line items. For example, if you choose .10 increments, you will create line items with prices of 0.00, 0.10, 0.20, 0.30, etc. Prebid comes with built-in options for .10 and .50 increments, and also allows you to define your own. + +**Price cap**: The maximum price allowed within a set of price increments. For example, if you choose an increment of .50 and a cap of 5.00, your line item pricing will range from 0.00 through 5.00 at .50 increments: 0.00, 0.50, 1.00, 1.50…5.00. + +**Price range**: An increment/price cap within a price granularity. You can have multiple price ranges within one price granularity, which allows you to specify different increments at different CPM values. For example, you might want a smaller increment (such as .10) for CPMs under 10, and larger increments (such as .50) for any CPM over 10. + +**Price bucket**: The actual price targeted in the line item. (Note the name of the key that is passed in with the bid price, hb_pb, stands for header bidding price bucket.) For example, if you’re using 0.50 increments and you have one bidder who bids 1.45 and another who bids 1.20, both will be rounded down and placed into the 1.00 price bucket. (See the next section for a description of Rounding.) + + +## Rounding + + +Bids received from your Prebid demand partners are rounded down according to your price granularity. If your granularity is .50, a bid of 2.95 will be rounded down to 2.50. Consider the following scenario: + +- Price granularity is set to .50 +- BidderA submits a bid for 2.75. +- BidderB submits a bid for 2.55. + +In this case, BidderA is the top bid at 2.75. If only the top bid is sent to the ad server, BidderA will be rounded down to 2.50 and sent. If all bids are sent, BidderA would still be the top bid, but both BidderA and BidderB bids will be rounded down to 2.50 and sent to the ad server. After reaching the ad server, both bids could lose to an ad server bidder that bid 2.51, even though both BidderA and BidderB initially bid higher than that. + +{: .alert.alert-warning :} +**Important**: Rounding does not impact the price paid, only the auction on the ad server. For example, if your bid for 2.75 is rounded down to 2.50 and wins on the ad server at 2.50, you will be paid 2.75. + +Bids also round down to reflect the top price in your granularity definition. If your price cap is 5.00 and you receive a bid of 20.00, that bid will be rounded down to 5.00. This is important to keep in mind for [video inventory](#video-price-granularity), which often sells for higher prices than other media types. + +{: .alert.alert-success :} +You might have noticed earlier that we gave examples of price buckets of 0.00. This is necessary because it captures bids that are less than the increment value, but are still valid bids. For example, if you have 0.10 granularity and a bid price of 0.02, that gets rounded down to 0.00. Even with a 0.01 granularity, there can be fractional bids, so a bid price of 0.005 would still have value but get rounded down to 0.00. It's not going to compete very well, but if the hb_pb=0.00 line item is chosen, the bidder will still pay their bid price of 0.005. + + +This rounding might initially sound like a bad idea. You’re obviously losing revenue when a lower bid price wins over a higher price, right? But there are advantages to using price granularities and price caps, which we’ll discuss below in “Pros and Cons.” + + +## Prebid Default Price Granularities + +Prebid provides several default price granularity options. Work with your software engineers to ensure the Prebid implementation is configured to match your line item setup. + +### Currency Considerations + +Before we get into the details of Prebid’s price granularity options we need to talk about different currencies. Prebid’s built-in granularity options were designed to represent typical bid prices in 2016 if your currency was USD, EUR, GBP, CAD, AUD, or other currency of similar value. So when you read the values below, think about whether your normal bid prices fall into these ranges. + + +If you’re working with currencies, such as JPY, INR, and CZK, that don’t fit into the predefined price granularities, you may need to define custom price buckets (explained below). See [Currency Module](/dev-docs/modules/currency.html) for more information and additional options for working with these currencies. Specifically note the granularity multiplier option, which lets you "scale up" the standard buckets to make sense for your currency. + +### Built-In Price Granularity Options + +{: .table .table-bordered .table-striped } +| Granularity | Increment | Cap | Number of Line Items Required per Bidder | +| ----------- | --------- | --- | ---------------------------------------- | +| low | 0.50 | 5.00 | 11 | +| medium | 0.10 | 20.00 | 201 | +| high | 0.01 | 20.00 | 2001 | +| auto | Sliding scale | Sliding scale | See [Auto](#auto) | +| dense | Sliding scale | Sliding scale | See [Dense](#dense) | +| custom | Custom sliding scale | Custom sliding scale | Dependent on scale | + + +#### Auto + +The auto option contains a series of predefined buckets. Any bid over the cap falls into the next highest bucket. + +{: .table .table-bordered .table-striped } +| Increment | Cap | Number of Line Items Required per Bidder | +| --------- | --- | ---------------------------------------- | +| 0.05 | 5.00 | 51 | +| 0.10 | 10.00 | 50 | +| 0.50 | 20.00 | 10 | +| Any bid > 20.00 | 20.00 | n/a | +| | | Total: 111 | + + +#### Dense + +Dense provides a sliding scale similar to auto, but with smaller granularity. Any bid over the cap falls into the next highest bucket. + +{: .table .table-bordered .table-striped } +| Increment | Cap | Number of Line Items Required per Bidder | +| --------- | --- | ---------------------------------------- | +| 0.01 | 3.00 | 301 | +| 0.05 | 8.00 | 100 | +| 0.50 | 20.00 | 24 | +| Any bid over 20.00 | 20.00 | n/a | +| | | Total: 425 | + + +#### Custom + +Custom buckets allow you to set your own price granularity. In determining what that granularity should be, we recommend analyzing your average bid prices from SSPs and placing them into a histogram. The price cap should be around your 95th-percentile bid, and there should be finer-grained buckets where more popular bid values are clustered. Note that if you use a [price floor](/dev-docs/modules/floors.html#price-floors-module), you shouldn't need fine-grained buckets below that floor. + +After you’ve determined what you’d like your granularity and caps to be, work with your software engineers to ensure the Prebid configuration matches your line item setup. + +## Pros and Cons + +As we mentioned earlier, you need to create a line item for every price that could come in from your header bidding demand partners. Without price buckets this could result in an almost infinite number of line items. Instead, you’ll need to weigh the pros and cons of high vs low granularity, and possibly adjust your granularities as you analyze the results of your Prebid implementation. + +The following examples give a general idea of the pros and cons of high and low granularity. + +### Example: High Price Granularity + +- 10 bidders +- Cap 20.00 +- Increment .01 +- Send top price: Minimum 2,000 line items +- Send all bids: Minimum 20,000 line items + +**Pro**: At .01 increments, there will be minimal price rounding (up to the price cap). All bids will compete at (or very near) the price the demand partner is willing to pay, maximizing revenue. + +**Con**: You have to create a lot of line items. The numbers shown above increase dramatically as you increase your price cap and your number of bidders. If you send all bids and add five more bidders, suddenly you need 10,000 more line items. + +### Example: Low Price Granularity + +- 10 bidders +- Cap 5.00 +- Increment 1.00 +- Send top price: Minimum 5 line items +- Send all bids: Minimum 50 line items + +**Pro**: Setting up your line items is a relatively quick process because you won’t need very many. You’re also less likely to run into volume limits your ad server might impose on numbers of line items. + +**Con**: Prices received from demand partners will be rounded down, so you could be losing money. A bid of 2.95 would be rounded down to 2.00, and lose to an ad server bid of 2.05. You’d be losing almost a dollar CPM. + +The following diagram, based on the high and low granularity scenarios with ten bidders we described above, illustrates just how quickly your line item count can grow. + +![Line Items Required per Price Granularity](/assets/images/ad-ops/planning/pg-line-items-required.png){: .center-image :} + +### Balanced Price Granularity + +Taking the pros and cons into consideration, you’ll want to balance your price granularity in a way that makes sense for your configuration. We recommend starting with the predefined Prebid price bucket that makes the most sense based on bids you expect, then adjusting as needed as you evaluate the results. The exceptions to this would be in the case of video (see below), and when you’re working with currencies that don’t fit well into the predefined values. In both these cases we recommend custom price granularities. + + +## Video Price Granularity + +The predefined price granularities in Prebid max out with price caps of 20.00. However, video inventory is often valued much higher. You don’t want to have a 20.00 price cap in place for inventory for which you’re expecting to receive 50.00 or more. For video inventory, we recommend you create custom price granularities. Determine the granularity and caps for your video inventory, and work with your software engineers to ensure they configure Prebid with custom price buckets to match your line items. + +## Mobile Price Granularity + +We’ve mentioned that you need to work with your software engineers to ensure the price buckets in the Prebid configuration match the line items you’re setting up in the ad server. However, if you’re setting up line items for advertising in a mobile app, your software engineers will be working with the Prebid Mobile SDK, which does not have price granularity controls; price buckets for mobile are set in Prebid Server. In this case you’ll need to work with your managed service provider to ensure price buckets are set up to match your line items. Note that from the ad server side, line item setup for price buckets is the same whether you’re working with mobile or web. + +## Next Step + +[Creative Considerations](/adops/creative-considerations) + +## Further Reader + +- [Planning Guide](/adops/adops-planning-guide.html) +- [Key Values for Ad Ops](/adops/key-values.html) +- [Prebid Universal Creative](/overview/prebid-universal-creative.html) +- [Deals in Prebid](/adops/deals.html) diff --git a/adops/send-all-vs-top-price.md b/adops/send-all-vs-top-price.md new file mode 100644 index 0000000000..de00664b6c --- /dev/null +++ b/adops/send-all-vs-top-price.md @@ -0,0 +1,154 @@ +--- +layout: page_v2 +title: Send All Bids vs Top Price +head_title: Send All Bids vs Top Price +sidebarType: 3 +sbUUID: 3.2 +--- + +# Send All Bids vs Top Price +{: .no_toc } + +* TOC +{: toc } + + +Prebid provides two options for the number of bids that will be sent to the ad server: + +Send all bids to the ad server that are received from the header bidding demand partners. This is the default behavior in Prebid. +Send only the top bid from among all the demand partner responses. + +{: .alert.alert-info :} +There is also a third option if you’re using deals. See [Deals in Prebid](/adops/deals.html) for more information. + + +Here’s a brief comparison chart showing the primary differences between these approaches. + +{: .table .table-bordered .table-striped } +| | Send All Bids (Default) | Send Top Price Bid | +| | ----------------------- | ------------------ | +| Number of bids sent to the ad server | Sends all bids that are received before the timeout period has expired. | Sends one bid per ad request. Only the bid with the top price for each request is sent. | +| Reporting | Gives your ad server the information to generate detailed reports on bids received from individual demand partners whether they are top bidders or not. | Your ad server can report only on bids it receives, so you won’t have visibility from within your ad server into bids from demand partners that were not top bidders. | +| Line Items | Typically requires a large number of line items to capture individual bidder information. | You can set up line items that are independent of the bidder, resulting in far fewer line items. | +| Key Value Pairs | Separate keys need to be defined for every bidder. | Only one set of keys needs to be defined. | +| Data considerations | The amount of information that is being sent to the ad server can become very large. You may need to place limits on the number of bids or key values that are sent. | You’re unlikely to run into any data issues when you’re sending information from only one bid. | + +## Send All Bids + +“Send all bids to the ad server” does exactly what it sounds like: every bid that comes in from demand partners before the specified timeout period will be sent to the ad server. (There are some limits, which we’ll talk about in a moment.) **This is the default behavior in Prebid.** + +### Reporting + +You might be wondering why you’d want to send more than the top bid. After all, if a bid wasn’t the top bid from the header bidding process, how could it possibly be the top bid after reaching the ad server? + +Realistically, it can’t. The main reason for sending all bids to the ad server is for reporting and optimization. With all bids, your ad server has the information it needs to provide you with reports that can tell you who bid on your inventory and what the bid price was. This helps you to: + +- Evaluate the bid rate of your demand partners +- Ensure contractual obligations with your demand partners are being met +- Adjust your Prebid settings based on who is bidding and for how much +- Evaluate the effectiveness of your current Prebid setup + +### Line Items + +When you send all bids, you’ll want to create a set of line items for each of your bidders. Each line item within a set (or a Google Ad Manager order) will be targeted towards a different price bucket. (See [Price Granularity](/adops/price-granularity.html) for more information.) While this is an ideal scenario for reporting, it can create difficulties in setting up line items. + +For example, suppose you have the following line item setup: + +- 200 prices +- 10 bidders + +This would require you to create 2000 line items (200 x 10). If, on the other hand, you didn’t need to separate out your line items by bidder, you would reduce this number dramatically to 200 line items (200 x 1). + +{: .alert.alert-info :} +The Send All Bids option also sends the top bid, so a hybrid scenario is possible where you need to create only one set of line items, but you’ll use all other variables passed in for reporting. + +In addition, some ad servers limit the number of line items you can create. Check with your ad server to ensure you won’t be exceeding this number. + +### Key Value Pairs + +{: .alert.alert-info :} +For an overview of key value targeting, see [Key Values](/adops/key-values.html). + +When you send all bids, you’ll need to have a set of keys defined for each bidder. This requires the creation of a lot of keys. For example, one bid could include five or more key value pairs. If you have ten bidders, this would require creation of at least 50 unique keys. + +{: .alert.alert-info :} +Because the number of key value pairs sent to the ad server can be very large, Prebid provides a number of ways to control this. See [Prebid.js Controls](/features/adServerKvps.html#controls) for engineering information on how to modify the amount of data being sent to the ad server. + +One thing to keep in mind is the length of your key values. When you create separate line items for each bidder, the keys you target will include the bidder name. For example, if you’re creating line items for BidderA, your key-value pairs will look something like this: + +hb_adid_BidderA=123456 +hb_pb_BidderA=2.10 +hb_size_BidderA=300x250 + +Some ad servers have limits on key name length. In Google Ad Manager (GAM) the maximum length is 20 characters. GAM will truncate any key name longer than 20 characters. For example: + +- One of your bidders is named BidderWithLongNameABC +- Prebid passes the creative size for this bidder in the key hb_size_BidderWithLongNameABC +- GAM truncates this name to hb_size_BidderWithLo + +When you enter the key values into the line item, you must use the truncated name: + +hb_size_BidderWithLo=300x250 + +If you forget about or are unaware of your ad server’s truncation and include the full name, the line item targeting will not match. + +{: .alert.alert-success :} +**Tip**: Prebid documentation lists the GAM truncated versions of ad server keys on each bidder parameter page. See [AndBeyondMedia](https://docs.prebid.org/dev-docs/bidders/andBeyondMedia.html) for an example. + + + +### Data Considerations + +Imagine you’re sending all bids to the ad server and you have the following scenario: + +- 15 bidders +- 7 key value pairs (KVPs) per bidder +- 25 characters per KVP + +You now have an ad request query string that is 2,625 characters long. There are many options for limiting the amount of data that’s sent on the query string. See [Configure Targeting Controls](/dev-docs/publisher-api-reference/setConfig.html#setConfig-targetingControls) for engineering options on reducing the amount of data being sent to the ad server. + + + + +## Send Top Price Bid + +“Send top price bid” is the simpler of the two options. With this approach, the only bid sent to the ad server with each ad request is the bid with the highest price. If multiple bidders respond with the same price, the bid from among those bidders that was received first is sent to the ad server. Here are some things to consider when deciding whether to go with this option. + +### Reporting + +The ad server can report only on the information it receives. So if you send only one bid from the header bidding process, the ad server can include only that one bid in your reports. Send top bid is a good option if: + +- you’re interested in reporting only on overall Prebid fill rates and top bid prices. +- you want to prioritize simplicity over detailed analysis of your header bidding results +- you don’t have any contractual obligations with demand partners that require more detailed reporting + +### Line Items + +If you’re sending only one bid with each ad request, there’s no need to create separate line items for each bidder. You can create one line for each price and creative size. For example: + +- 200 prices +- 1 bidder + +In this example you need to create only 200 line items (200 x 1). + + +### Key Value Pairs + +When you send only the top price bid to the ad server, you need to create only one generic set of keys. This means you’ll typically need to create five to ten keys to include in your line item targeting. + +Because the key names are the same no matter which bidder’s bid is sent to the ad server, key names will not include the name of the bidder. For example, the bid price will be sent in hb_pb rather than hb_pb_BidderName. This means you’re unlikely to have to worry about ad server limits on name lengths. See [Key Values](/adops/key-values.html) for details on setting key values in the ad server. + +### Data Considerations + +Send top bid sends the least amount of data possible to the ad server, and therefore has the least impact on client latency. + +## Next Step + +[Line Item Creation](/adops/line-item-creation.html) + +## Further Reader + +- [Planning Guide](/adops/adops-planning-guide.html) +- [Key Values for Ad Ops](/adops/key-values.html) +- [Prebid Universal Creative](/overview/prebid-universal-creative.html) +- [Deals in Prebid](/adops/deals.html) diff --git a/assets/images/ad-ops/planning/ad-ops-planning.png b/assets/images/ad-ops/planning/ad-ops-planning.png new file mode 100644 index 0000000000000000000000000000000000000000..38093ef3972c78d12a1fd126065c0314807f9569 GIT binary patch literal 76833 zcmeFaXINCr(l$IQ>PV0Qk(@yR$vJ}zS#r)va?Uv^l5d$Z3u&*S@k*Zb4Cl<8TkyH~HftE#K+t~C=RD=mtGh>Hk;Kv2ZRgybQR>q8L8 zwLR!{aKvVe%@Mrau@O_Vhd>aeFaKY|e$-X~3NogGg0iwE)(+P8Ce}8@;(~(2Hg?uV zrWS?}h|5H>g0Z5)3MTL2^d4Ly@YzcVYx(<7VtIJTGmNN*k4Wyoo&=Jljo+7RMiUlB z!0UVycq2UgS?GN^8suQa&$s7E(!*b51O|URnRU-FAFV%J>^ZL-<6A1+O)l@d{T_-O zE5HFJ_kZUeONKnXo zsl@jT_yHHFtMGWuYtMYIy?2P>kbpkJfIM~!hi5|`i(Gq_{Q98+lcQ4r#LhJiv56K+UhpK`D;M3n)8VI=W^6Y`lB!XU0< zBnEj~4SC-SLn?znks%CnfqqmF1b2vTCmERw#5W#-A+n>wvrSzLTY3bLiZA1-A?Fl+ zt^uXBy{)1`M@ZQ#jzx{ZrgvR0;W1r{Ydj9qa~9OEyPqJCH&OS&-R_>b^xiG*?PUwE zx~oIG+H~uJ^y$;N^M$?wo5v8ytb^CUISqX|?lbON&n(Z=A8aC+Xd}IGJPa`^Lw#Hc zd9yO1vTJjRjc{6I&G`7j{QT!9AK)5#A5}chjaziytDIRJd-0qe?tg9kM*f^h>$xbx z(btwwdy-lBebIM(pMF`45IwC%x;P~mBK;u#v_|z2#+)3wZMaZE=q^(hX%IY`s_ntx zg~7KOnv)xRGpvxeW_;J&qiA!r^luzUP{33j-hVrUKz8b^n};c(H=dcinC)}E*y2AE zee(eF%t$=i76Q>0BBxXQSkB)8g+PSfJb(070B^4uo96v3{N|fqnvqU**?i&TA6nor zIHJKbd^=sLLLWG#f6rTjN4oUGj|o`b%bEDc*xaRSQF?cm*9P^69yFzyvi|uU1c6TI zJw1|%z-v!~RmsAkSn+;GB+X(7=pp39U4a;Kq!LlAVvO>^io{A{1UtNT*Es_;MQWqC zJ0VOyr~dV#j4z*;$?*;&R|?kTvg7)Sq$BkkI4~weV7^K0x2wSA4P{GP>Mt-sorvHQ z>|l7mjD4H=g9QU!dn>$@gXT_*es?KpA#y=G?px);8+AeZ`hBI&2 z5ekT@N~%hK7Rx2ZCuc#MxWj(uhOb-;1!+vKM8(5ewBrxhPnj44RK;k>M$seg(Zk#W z1wXKpqX!8xQPf0U7cb3J97G=!8MKloTcOEIWD&z9i|Lv$FfY5!`I3g1y3=nydA@a? zc^+?`WJd!r`RQZZ%p-+wl=2_Vp5QFN7FZT;8NOx`P|8SBL}QImhZm()$(P6l zJ_1MT))a-_loFp-13b*XJi!r`!6~I zjVW;wv2SA=<2YlNyq3(y84AJaP-I|dTzkC~j~Z{Sr244pk;nb0kBG0Hyn6Tw?-9LX zUVe7|bUu>Ou2Q#RM4q;SXR(M9v%*~7o#EI5rTk>sH3d8c<2>%%fPCXzYeoJ{FSWCv zTWYP6tulg{a&Jm?=IYytk@RuOU1&(mQ40JWpR;~=SlTo0;q<8P^%+532ycE~8mA!h z6K0ii`Q4XB{I};`+a4u3NZ(na%!%9e3ZBN;qWVUKm(3zs!)T~!o*x?*t6CsdAXgx| z*1%T0k&~R=AY7+*^8Btq#}f)o3Q^;T-kZrw3gZe>Ifyx!QoLOI#dP`RS$Ju6Le5QA zIh(Ij8nvILNLuGiyEZKS!1ts-Q#`Z$k+Uy~ta_^)nf%ryaxXSd8>_7~4*`A0Ybr@*}QtT+GbU~m7hANT9&Gk zx>mVJQF76P(Ym6#9JHJo=@{vPlu_f>x7$@+Re9AoZx=q_nk=retn$<|eu`yW-B#SX z8PgEsS?d{g#(NtjVEk?YfjWVgeT5wcmonFMLT}P0zh~QC>4y>6-x zrpXG4L!!o5#x?dYb^}9#Bz(H*;`rzi@!F?48|I%l?AvP1x()6pCzdC+Y~)UsY_e^d zZU%fw{lt<=m7>OM-{0CP_*HIUfFCLK6@&Rqp_h!H%yZ+)B{F(_`Y4s6vA5M(&iRLW zTUdMte0HgGd~-bP(@fK9I-l6zS9ex-%d}dj==jYDdXrrkT)15fKyscvxMqAK=()gi zjq4{zZXP5};rv{ah6iQi8v>zkY6R{JMEDf>EHoF9m~^g37Lgn-z3z?bHNER6>$N=E ze_L-+FQnBAnZhr?PsN`<+$K;JcYraD)p_8Hp#6-{520A0=|p2j8O{>gC#;Y7^6AWY zCfI9PYWdsgjMP4js3xn5TS(w@(mg6>v$ANMIo;R|_?G+)Y0e$%HGQX+jcZzO%bs5j zW*!|n4Oi@A$v|n2m)`|ok8&|XAMD(7eh`l6+CtD`OiDk%HW2t(Q1cO?^p4mgDYxkL zsCrgc@;2rynuQu)ioD2rNfgPcM6MLf1SeukCSI-v#uw31k+$%B5~-Lf<5lBDBd6{{ zL%*`~Hmi_odcs$?yUfcY3va5?B38k(mlf41#~$4-Gd5H)YU&C4$QfIZLfy0Rsr=() zBzw|U>cs|n3;JwyRhGYm3N3-^Vnd-BXBm&J>m=gb{hQSO%C`!6-UU}ZvK)~q*ieZp z_G)hlXt3N*UkE{?QnkvbIQw(;;gs3Zrqt- zv#4ICUT5#|hQPSsRKN(o#`%}eTVK4*-aEh99rz-8c+2la-+9!21ghZ8i1>(Ze-!_< z6b?R4&Tss7XDg>Uf_(;k4^yzt)6ct$u`ubqjz-qTdIw$)q{Z#T#WY!ZWSypeiNFrEhIXr)OaO)R4}_(grx95C{*yi;bSXxuFB`Q$u4@D_+vAx+YR$ zQv+U76;>$*DH}mU6H_raJ3|FGX+?cEbA3(&Qhq)}9v3dqfu*5?9_A$0h$d{Xbq9%!-uMe{cM+@mgB`*Gt!XGol z1MZbe(9TfL!P-vI+S-Ee4>|igf)f4{ZDK}FItF4&6;mq%YiD~Z9{PW8`1h>;-KU|D zo`WGDkV+<6Mn>>Yk&%gu5lAH~EdvJ^1H+Y0{;2tHeMngwm>RkMmp+&oxmcL5_Hm`= zzxM(3$Ux6Q@BgTmt97sRW1!DvWNl}u=fG!bsb_3RZ)0W5L;v@|D>eU;EiOT83u`+t zEJHqK9{T@w_`kLS@v7_};VPfKyeOPlTv(8ek&}&$mWht>YByKvUFqki+;WLq**oZ2 z=^Kg*@qq($rltm5hDJ|W^qH9%XgTzs>eI65feCo3$H)mjva=Z(aWXI%u(17{3@NFr z&HtloA!~idOWpgkYlHvGuCFxzkFI6xOo8Rpv$#^{a`gYVm-sK;{KuulOznZRyI#=( zpbI}Oqk^IBKac+FgoWu(3umKeXK#3^zr3XXQsBQ#;$If;vdvFBz@?{uX&d?UFV)M? zfQSAcNB(fl z{?9GPAASF`@xNb$hyHR!u`vDTbo_DjpR@EYx&6;s<+(JJTtFhg==6Th1kj=XIQI9I z|ERBeIkOgyKkKuxGk_O8PkPqD2zaRSd+OnoDh8C(qra*)3FXfV*37DpzjsE@2e{HGucT3hwIR0*V z<;uA=eF z@^83)3DMOGzu~%y#xKji;rb;+S1bI6>na+*EdPez5E+t?(PJt7!bP{2Q)c zLUgslZ@8|a@yqgWxPA%I)e67ix{Agx%fI3JB}7*%{D$i)8ow<6hU=FQU9IpNuB&ML zviuvaUqW=X!f&{)qVdb}Z@7L5(bWpS;kt^(FU!B-`XxkHEBuD*DjL5m|Ay zG4O)5EP{^POeCK^4Q0fYqABg5!z_FT9dzej9hl|9AKR+>axj(Gw-wR6kHCV-HFMZK zU-_w*hnc(1eRteA#pezQ_$mYl+^j}MR>l-)TMC8z*YoJjzRcC#5`z|ZzYF0cigDp@2#H|`5)Pfp>sOW5C?u# z!PD@Ot4U`h4n$09ya>v+O|=^Jp@|U??Zb|h98#nSyzDxT_>^B%CeFa_YwlJ#YfqiI zr%$ddwtgt(JBM=(zTYH|0#%Jfr_g#@W9^>dJIWM+^vw0*ZLiWsHRU$}OqcCB zT!-0iE?JueeTQ-PzJr#0n*3bW)O$Mzd_BthtVEuCT)|*T-OiwLi2jG&k3Legt49`K z@b4eQ@gT@)YfYntcG{Tr-j!2+w0c7cF*aFVWVzO?qs!U2-(tSy^f=uH#(8(?Y& zB?%)rdmCjHwJY-O_kttOBp6*4*>AnjyVHvVT0we6c5=A(BA#ut#<~zPfsCO*c@h6c3wK-g-g8 z&)-y0!9quOSI0!*V#@1eBTmQb*s^-csC@jZCBRyYFy}T&Aj}7r-pH>kiy{5iCK&$3 z>v`msRXB_UflN|COc^HNTf3J%dLKa`W8lO2%Hc^Iz0P?%p0(s_hP1S_+2w%@L4V}q z4*v6~SFikFq`u#IA{ZArHYas+D1C@!G44}~YPB#Rx8h&$be4s}(kT)3C82T{H%Wws zSV)90gyDfA8O_+#!Ek6ZwgN^LWpFyBSy)JIBV{mdShhKV2n((fhH$}1JLaQc(qPi= zGMerb%}KN{5i~e{N1i}13_VN)$6rrPc`6nLhenZ$^X`1!-sLH2G!Ty#lAGs{rmbIl zSo#!*rDjD}tKR7AP~<4_5NcAY9PJJR-IRA3lr0k8ZgVz5k#&4odXxcb`fU9V3D!_0 z8s9AMAO*weqN*RE2jTO$ysfILdh_PZyLYNRC}#P~GffwDTaDD+JF&DH=idYP>klT( zFU}8}ZajZ%XlUr@$SN!+EG#@#=R9Us>DAPfo}OM?t6nm8xH3dRM%KEtyD{BRS6Nw^ zo12@NDb%1##A)|o#bI$_p{=8%y1JT(+lhvek&%wBxVE-7KOd1qQC2oGHI?XYz}ni{ z+_!IK<>eY08i|RC3JMCG;oNrff!zyc=H__(ULNY|2?_B0f&x@Rp5@)+TIa3lI%n(h zaePF-gN;cQ&?q4R7m6Sjmq{fqFD%@aCK!MrjKkw%BO>BY41M+L)ooNlAUZd0A&W^! z6qJ-$o0vcmu5WB?c>dVicHwFDM;Tgi&@OS_n5dlVh(HZ!U07JKw6t7VS@AqMs8lZ! zjUWuOwA-j0Q>Vc^x(8$&%W~&E_SwwH)UEsDCWtd9r_;5uFis_-uO^QMdV@&aTTpco z=h7Y=Oi~y#LUUFP=3bebGi1|LYoeoA1a zhCwf97DM<_nufQ$4(pDNjyUZXLvdMG!?`yj);Q z^P{4o!Vu<6?iD5SWI+!i_B~i1-~C8kA{ozQI9>00@nfthR3sxoxA@(+;Lp@tcJrO< z>r zj@KVbm1vf8QLW`p+tNrm*4U6%uEI%#9wLxrQc|>|*QxDJn%6$)FfG8nZtl!&p6FwX zN!L}Zl&S=cy6=M~k1<$@DI^zo+Jg>{EQB4`Jt&ayk|$Zp41a)sw?wVnf5~-!yVh|{ zx+X!nKuS^)LwNiB^BW;p^eJ49tBXB}{O3n=V0ev()9ztmVIi2bxXebMZWDQY@AEz{ zZ)otGZSey__2L#v0<&>1|M@m5s}r&BEo5vM5s~+DKS|DznwD1b>(|RR9Lgoyyhfj1 zSDKH}sg-3~&ott(SuC%w53e|^HlW5DR;tr>m#u0ga&NxVA1l^+aT`_H+WtdFN7MeO zMk>HEfXM4}xp7~9etvInZ;ky@?`uZ=?Qd;JSadX0R4cgG!wI;JSa7#$mQwtXu%=y? zl8wrbi>jw_nG8D1`}j^a>$Wz>%X6}`{j*IIviVQe%YnxCrSNjo(OI4S*q^m=0iA(c z1Cpj)Zq(CszF$&3<8=Zg=QX!;ao>`H#@GBr14BcBb+EF8)b#2Lnc{cLHU}CEGq$>M z@aas_hy}aRvagyX#@oMMrj)_HmAc~=8E2$x`jII5e6Kz2F1>X>Q-)g`fh9^oU%LiJ zOiF2@nztCD$b5KjZUTN;^gc$roPfBUO?0MjIuks19Or&x&3H_V#d~blih%n*-)NJ@ z->ZjJ@YCFGEgQm9f~GTk6dTnK6^p}De|qlvx<#^d&d|!>;NT-_YM|Rq z8byw$VG`2PbTl;U6YqqgGac7PEyv5+Hk`&rNAD8yd|uo4ho=$px~bB{e)#YKXku}L z9gvoOpgA3c?iR;83t*0=B_)v&t|ziv7Z()hV?X5M<3kUk43^i_{8FUBo{;UxHRXHf z-e{p3Gtfn?I;SbOwM%1Wh`k6Vf5?QTS-0PWC4ZrV?KwR^SWG^3y~zIlozTfYn@?wq z#nZ*iEQyX?si~Uo4W&?r+)zNyC;XW9QVe)*7tTPLB8%J8J7#l=vCUIMC{TSJG0oC) z!B$!9j8KFrUWM`#Ec~r|wuQW>A5Uv}9lb*Py}ecP^;Y~3Y(&zvi$>lsoX_Fic2+ro z!P&@84v5^ye6vqY&C|m|?!%$^rgs|~zjvNzTq6*@ICRdU5oG6VUAglETEg>v;(Q{z zU(G9Z&+UwLOmk>>xWc$Eg+$O_GLdcL!>%B-Z+B#5gxh%&i2A_VK8qAsc<#YTqXH*4 zs?>{c!ya;S*2tvt0qC+RgR@P`$0djMRCGM|Pi8L87vgkA*Y@MIoN(ZQ>ABMl?psrJ zhjS79y?uRKBL#8F1xgrgOS?holu)0UEwBU{m8)$GQ3pRIhCu^bOJB(0#ka42E}bjw zAgr79$183)mcUF^jmatkGK5PGH|AtH9mHl@a^yf)1@MI2@ELu3l$ z?D7w=UiaGN?{<}oB2U+obMtAeB@vU$Wu`o!e;c-zD675Dij6|=NbIYwiRK%qE~X^- z)kGtcxD}|i$JdE^_mr6sm^_kr(2xo{!cFnJ0Sop!%4#&RK#gWzre89luJFgJ>_js>|yqxD9Qh1v=LAwyRu^ z;xmR=Xq24#&rU7~PwniHL|lYSHS1rUnAsPkN7fa8dQxGEWnmE}w2(+)(8+Y%&3%8( z$r-;8RdP8scVW4qa=P~!hrSS^)ZD(irnkpj|JdY&5881>H7djEYaB9puXg`3n(B%Q z3$S2=8Fh4YeDL4_D*vgCxOh;P!4nyo8L-r?l{9%R_oq=QWPkBIoLa5)J~`O9INS1$ zqtlxB{P}W0+nB88-~Mn97_ejpy%wOYgmuDCS#Z}@SJlXPqVfp8ZG2`(GN` z{Nfi6$d299!v-~0&vB#ZgT~E`kMa>CZNIeb|0a%Ln z`7!YGX3jR98{GD}cyV4vreaJ;b9AOsuuTBg;n{BU_)$nws+pM6GJ^=S2)PVSG$plI zP8u3K?p1pn!5(%6ayupdt2-pvWC>jRmC3LV{qF{FycUNhP927}N_wbzOC<@DDr&z3 z!GgcrRV%)z)$(+I4V&NboSbC)B(b_rhySXYa3^#vj-l4tBRV;Qq1bAN$Q%{*Q5g|E zdD}BIQs_u^fUAJ*iJxkNlxiehb_$F_b3lf$t)Qr=XTvG(&jMkdLu12z_M>BS{{F2mgSObQXZCVIaLp za>n)664JpW%^x@N53IO{aq##s^f49}Fap@{mH5<#mQkK?g(LdTv&lG&SKSSMxM8K& z$`_|DkZ!gsWQs`QlkPK!16xaI-6}Ep?AF=Zuju+prBxQgj}lQ1!^%k*sA+dWJv1$4 z>eG2-g`IK0k(3-ZiM8x{teMS;pDUiax~7~j%x`-ejxD6;i)OVPSUA4%MPn|5N;Apw z;K;Y8x0v zukX#bad2=zT)fn^v=8FM+-`ikd_3#=ffa{?m7$!q&xZUXqeU7NQVDwnI%kNRbk`v7 z{j`=!y&~+TTm#^du~~Ja`Y%-+H*>$kd^lpYYl|%9)C!~pchf^*3FY{Dz8pQyqt@$z zJiDf}-MT1JB%wZNL57qlf+W5!a;}E6XhMn1fpcVUWYr^d?F9(gq2ut zZFv}>3IhwP4ljf`3i@ZC>P5AP6{L~X+g(VUpox5Oj<~2N?PluR^@YV6j^G$R5SK6M zi6+mZ2JFnx3Y5f$xU=lbzVs6dxC*?p#SaMt*Ty{wuToP>2232dl54LE%bA7wsOydy zCGzxzr00&9;rK@x#>3!46%!pw1jmXn1ki7gG2jc_baOOw=~N^X)(D4Z*@vktse*s( zre5&ae)|BHH`Sui&)0zX17}ZMo&$e$#X(C@oB?~-gr!u?)lluOAAI%kR_RFkPj>8e zal9Y_Nsj?jTlkZV0be+Yzn+(PBhVY0_L$p(3M`(%(~q>`%vGPffRTt598U*ZCA7GO zKSZEHAn`$-u#Ujj&z$ZcLD){mugiG>8?@WYyL*S3MXKL9Jl~weXU~!ZJGC})7lGsh zux77bv9hpqmaQM2puumwNb|lpA24CTKqTOD$W2RYUfah-_BS2MR#H|5;h`u-n~%?R z$HF3ifB&+wvd6@->gxF;X6)9}g}nxNiA_Zr8Tx=%0ki>FL(^nUK%DB<(5Tbog{?0h zy}G*kvAg@s%Nv|d zz0u?N4iYP_l#A69Zf?Wi71@r#i5r%gYZIYt>N(2a9Bk>3BDA z_1EQBRyu<4`}yNHDka(=0{_O*yLD(iS+xQ5m8SbH0r*Zm_OS&!%gL&u(o!^i9<$+G zaCiQCfPMnwpcao#h#wvV!yI`&Jv1~V3JhTNq)L%`*3imbe2&PJ6tA}XD!B?Hz|tP! z^tOvVJ?fynU}QzaCc4-{&@%WKYfx+SppQACEFxLs>k5)FpEKFB=A`pzPBLp^r7M~A?SY@ z9NgLRzHsk~eh?)_j)7=sY+RyR`VF{Wz1`gsQc?{|Deiz8l9DIh)NM$9S?r<`Z*Af0(#yg=nsRaPFIo<0Y*;nwx%z*n{yFI%AZKJEqt79K9HPxDvc z6_Z5)BCqyzr(3^kZnuwrrovP~Nl6LNblh9@%&t50V6_62$<|6vYOJ9va1YnUN{9fx z02md(Dp(4@l#A3WLBBwAU~sFtjjH{%F?Lo~TD3BAY~*S0i?ejfX~!`wjcO~DfL8j( zqjcQz&Dyo%%b9Oz(1Q6g>bF0Z(E=W}_ZrW8oUFULZmlTnJp026faLQ&og+enW9uhN zQv{Q?zn*&shU>jIAj%?j$)$j~0<_4E3(w_*ETwu|F~wI|P96+O&`ZTLJ-|lJUsF+1 z0$_Loe#9G~f(8c^nRJf*#rfGK=Xe*tf5ia^oBUS2OM|v}v`9GqvG>KH_xAQShHxIc z$uQmnw}zBCj^K2LcEAYL0}uq$`YXq@-H*P{f{;H3OIcCTge3tSxD49u7eBdzu+jL_ z>*g|=4%>^x-@FDC!zE{{Tu}M;t!z=e3vfkCY8DgB zOB$;3@>WJQtc&vUaCqJJF8$}b0o9h1PGIPwq)~uIBINUUS6E0xOS=Ik!)w+L3kKJy zvKW7>*9z<*5PXzdts2%10Bq;HV|_qyXi=*Jk$=2%)HVELAIUj4+=S)ht_Prs(BPOM z3-fY-4b<1u(*t}7pmZf9LOSML7vqf)1OPh@JYTEoNdu<+%_%(n!YWf)JfGY!&Ty5G zfeJ47FWFLwxOjLQPVTn0r9Tt_)#8tgvojz{q@<$Km&9og!iX8?B)~H92XC6p+fhFs(ABD^@o6C3IWa*Bw!XBd#kqp8J z3JgTcnZ}0N+62S#q$GS{xg_Z&pg7;0>bSYMT4vv-Q=*`tfY{M2CaRmRZvB;twg43H z3&1G=tm+LC3`9R*{Dxn%y6zaf>jE1!OQt)-2wlN&m{A@x^XDT|k2BS6%W4W|<<9gnEjuQ~Ku5F7_p9Jkm3@dWHwD!>%*Z<9vl11v>V^xMZCX|j}< zXn^FyMD+7%)+I-mGw$JaO>3Psv9^v7B3)Ggdkj*1GOxWiUv>#%2s@Irs}}75OCLia zlftO)FP(!F&Op`yT#{cFs8(w6@v8iwSjmjI2zJ;WEpS$Ym&3>t|zckt}UuIS%g$akfeEAZPcVLqP5KFvHt-_W> z6Z^n!6SA5O1G<=rnYqWv-qZ68Xto5jbaDd_s56b8KE%YnAPjxM=rtF{4puk7@!Uhc zHL`l|Me}#S)}!LF(Vz$Qv+z2ttIA=FK!8K}6^o0ERNbyyE7*uD62Uh{9jzmp5P{ z`Q*tXdU~Bk56)Hw5S#V_f~Bv|xo!#=4X{A2zPNVd76bA zR-)4ch)BckSfDh#)YRsHCA}Lk2OL4LOgeJl1IRFh_m>CA=;-LMk(HH|4>qUV+e2|m zrSl002*4)Y!X*nbFu({LA+X8tkb>g&_2;jsRq}Z?{Za5@qobL;&piN@rr!|`_$~L% z8e?DygVQg!2PkN0=;$zox4|-{U1MixWVC4QeKPswi)KVe>#hf|xFd1{fD&vE!~0`z zWmq+C3=rU_r>DRm#2Ny|roYMiVtsubSopZOxV}_=?~!~Z>73o2Zu-8iuJL!ab7h9z zG?*dUB~8FsGBGhpJ{$t^JuvuH-SkbG1tZ#?`y+Sm+yTbml4B3PPd!?qlNuX43TPy7 zA>cLxj{(~l83OT2V`fsZ6t7wt&_MFMHY;OI=yY;Z{9y+LRhzHKOG%7S1}S}E5+gG1 zL;5q-TQc4T8VsaE7{YR5%1{#DY|40;5KM}o1ng9H`Re*G_&vS<9a&HuT_8|5)D*FR zTORB)3JpQYXu1%E^%7drGfz#G&wZ~2m3X<%hwS%Y>+_28@)U5leqG`(*+342l88Tq zq9wGH`M^Xl`1rI!XzuwyMPBO)=?P&7F+9y3QkJo2Tgq43YD%)Xd6rt<2_`9y$oq7A zZ)M2(-K_sT^Jom=h7Q}0D9O@G!+8pqdpzMp{CrhI3UoX(@5!ryC;BicjK5G=?O}Kp z*Nybn7WF+`9WfId5$-d1x>RDE-WyYzCr?Uv%oSzBSprV=7tDU&wo! z%gV#xVkKG3=nib<{%JOpq+JMlzK?LP^Ol9N_`N`*qSdDO_%Q`HRlJW}l`}CYi)tMu zm>}6BhI)`<#*Env2B*4f*>pXTpPaxH#q(W$R8}cFC8;llpTUEb4WrSgx;MqQZ?}o4 zu)v}z5g%|@P}wF?6UTFYw3>C1b2|R;qY6fXHLVfO$annoqP0{|4x@S!7`dY9kDSe@ z5o*0<7GU*Z!Ic^db^qwMH06BbDbPgCH(hfw?DJU^%ZH;s+~!}81Sw)#n|ivhl#)C+ z0Cd?P1IE)l3M+azl=u6@HG!AbjXdQ#&WUcE=C;C%G~88sskikUTrWPT&B+&uNR8>N zR`XPz=s07Us@AsMmkJsp_4PVyX~b*KMA?`PEUGFm+nq@r=5aNSk`@Fsd4yOzACIAi z-%`nzV*RN%FAELtT$JVc+oV*h`nBM~X;)>(0$rgWcJ|$;`?Nlpp)2>i*FJm-7V&mU z*Df)H3OLfHVeysZnIUSSv+85Z#53L0Pl}BEu29XI*aOxf7fnsgF{EQEEU=tCo40k# zML}?1e0@0bqow{!Q@>MN|2(UEQpW@w?4WfVNIixYQEf#UpoexgH9X2;==ONit1^YZ z9&16_Q+e*@R()gt8t&ZWL&JUy?W%^bw7gl~xe8n}QDI}>xCcQdsxJ+eoRpm8F%AMg zY~p0!5Iqf8JHznn*bCay(Zw4bYP4{7Z}Kn~NpEaq^~jyp8AFFd^Cq7nu5qk3ukF~$ zBRfhp2m3!8$y^zma+}JnIFR<*pra7*O_!DPKUQ@=QcYy%pNa(3r<>wL43Ux+X%`vT z0b8<^kW+MWI*3raOm&IwSViK4B@&_>#BMQ^vC6yjws`Z4oy#%SibIQBVQ%26v-3+^zn+rq7HhAwDiDH?^tMwYgn6 zp&ehMZS}|QU}#O=t!f>YA2A87``0qU&(A*9GkV^m+lqVZ6nBqA2x_(-czQCoD%f$V zaEs!?%Sc=LV@;}1%F=OryNGynZTLKicy!-V3^^6pa<5{*zst_T0)9lJc*@F?Pe)2h z%FBxnPKh4$x@Ym8$np<9Ao8UG)z4Y1Z4%-lWOc<5HB#Df$ex&{ippitD+C1pMdScypoDFsxMH}T^8>Rtg z;omw7mJEujx22`qfSLts+SyR*IflkN5XfF`!;YxvY^<*r=I7&ri~>OUdVlf)i3GgP zn_sfCANux#Rm{46yB$z^M_d2`j)>^nQu>HwK9Q7OL-~bx^GDEhF#linBYQP}!nA{o8IxIsc-FMXoN z*Kqu^MMW8nC@GpF*Qn~Gyc~vWib@B!C^V0`vi)IV7UdI9Ha2?dzTL~jls1OY34uf4 z_}nKWdk_bM zJ#=z(z{J~f;FF1jcJ}u2fxS&YI%%k@!{9+dL6;F%hq)*e1)swP_*tv?H9*PVyT z!i4>ZGnbar+76UuDq1OgGwejty(F7_8(6jFNHNJQnQaqM-?8E%>d&JfoVb zlB?D{R<(1J!9V}hEe~Wyl$J8WpnF?0O&|{mgkhJNE_!-tT-T}KCIAqShXWk*!{;|{YkM6VmXBLh zs)KO<(yi?vaIOb?9$>RVLR@^j(p=@~)2ARu1PD4HT7dfrL;(ix*91v@?`tFpSHHrL z?dy%6rR5dBLNJrM;m6oQiSa6;$~U;I$NL=#KMeEY=tr7T9asCl%xhlG@}3xCF-l(T z97+S3%CVIY^qW~7Ybf}FL!X}-Fv870a;F?uC>JpWaVl{qUYvG8i7jjSb(Z zNGBog&h$yYG8A<{D>VDLNBMA>!@4 z{Px~~d+#*dABV%{tNT{N(zZ*A+iG502o~^*B@0Fnefmd7tAHOG&uq*GwuI`OHhy&L zoWr4V0X*I-S#h@jEn_`h4`Krxk`HBt$^}`bAixU^4ZTd6n5Zz7;n}`)K!JNYIX%s1 z`0-^OpbP-p!3{S7{0kK158Z9p8^-JTFZXXnnUpy5&&LH zojF&cmRyR;uoIf7I-L6vH(rvSBVj12GMgqRxmrOQOhixMTvzx-2mQ-=)lhXrh1?o4 z`4McW$inlRP6_SqX7xyHRs9&fGVGsl;~2B8Th>BWyYJTQk#jUt zD;P-te5aH9EJraQ4@$22IZH8J^74MB9%bmjZt4h{uj-E@)i{Z&YTEHp%mSowwegya z^q4d%KUgT5$k80Dl!0T0vS2y#{m?*P-SDi-G!MVENjP09_Ur@gXf${k_!X{*Munj7 z+n#x>_jD{wwBP3W88XmQmcfUsh-n0cZ!W~km~)`C4Jy8l8{1{ZHT(^bpLmr>&zEVru z4hU{Ec(9KNF7u4Tjpm~dc+?nv9Kl>N(=D=;iXi?v-R(1HNjN(>oB^31P!c%|za0DVDKoA5iSnUG(-4zNQ99)?PHs>

nmZ5jr>!5TI98zUXL^bXvxtSxnC0Dk)-rCN8Ta0kfqcvexQ&Y`jpR>$~Uj^m7wYD?1w-1lB9@8l#cRaE!nkfUWOV$nmoX z`E>vh+ZG5YfZ`z7C_1B~u4x#65W#rOR9U0uO5PxjsTHh}Dwt)_OpA4o@ z*IP!v&M8COBJheot9K6ONz0P#`BCh<_LGdVr+$+_YZuU&oWlByt-}Z-bS@M1!he>f znF2V?RyZ+l=z+w2frXA(0DxD&(3$lelILGaeb0u;uNON>w(o1xzE!>)@_{8Bo!dm7 ztLeH+3?(TS^1d1sq0nBo6+nkiK*eGzFQU?}u@Biy?}LK8+-{Qdy}vC{So>d$gRQ@5 z9+mqT)V=gvaulF!Xd+4@f<+e?$Q|H42JO^5r^w}3D`#pLLP9WcoR|ogNVih-1Whvl zz#C#y3LUhfb-P(oN4_4^=!z)#eIfpUug!gVcUA>4)dHq}d$D-wK)#F5ksWZ+c$P26 znWb)q)^`X77F0MQg6;Nc<(EZ9dHz+`N(A!N_$IV%i<-S_Ze&e>wJ*j&erh^ZmQcrg zCr#ja)+4rA?VNHwRwpVsQ{#$coD7c=S6HG}rzzseD;v1U%M`WdszkD;!1GNxjLG@W zq5IQms8(*kR~%10CnsIBQXBhQ-K5?#0qgyR%(II1N3jPHA-tkUcDBnnE6{YHFc$hS zXf)dKw>Pfvs9tNl*GxP(20WPYxALk%i11zj2+lETZSvCRVKHuqN(fJ=aAdqKM(YpZ zUXA}R!LS9@aV?tRo)U@@>`%#bLh?5N+J%u~8csOn<4JmZu8AhkuLf_@8o4uuf6*eStT<}MhszA`dk^WNp^+aqpiiz2! zLTldp0u>GAvd=W9FUw+`fxe;K7N;cA(j$@n6sNquF+1Sg90&v(at}ZFCO2G`ML|s! zw00%!J73NMjSl@aUi@`tfUdRy88ya(9-aBHnD33a?^i?`$yR*oR?2q%QneQ1Hq&1Y z{AYk#r705HFQFJoi!%aC2Dn#3Fa%h^%f~&0^iE2N0`<6|xncwH@6yKmLEUQ?{rR*E z$T?&%wxH-A#^25X+FMn`uuQ^P70+72cdz=P?EMy`Dhpn!00kaWpm^=-1pS9iA?HoATNQDLWE6#oQnVt*$ zo>bAY*Id@o9Y$JUoNctHT;%n)oy4dAXA=KetBc~+2OTlE(&A|bb3mbim-TB?^0V*i z4MR^ z_RoVxWkI5~M#0$3byRS4qYMJ#HUnuwpg48zTkNBMlzj_L=0C8&Jr2qV7)nmnM7Hu7 z03QrT6FstxI?}JfAKddB*pWBbT-3K*>VU-Zr^|(Ji$8SL*{JM=FZ@-=d!Zz-0eo_g zO~aKwyS-dPnE)I4;JzLxU@gS=T>lF5fCe_44*>Mne-__-=oD|5+QodX!owgzao@zC zfqnBY2@a}+iG%f$5LYBqu9Gn`hS2}nZY%tZtPIaeAfs}#K4?Yla_jfxbw@g)CXr5by`i8Y%&S~>X|wK*!|C#j zRgD$a?iMh$6(_Z60e7n{8PmIRzVqu!Hw#Yo3TT^B=ie0Or+*$s3p+?16-|tIB@^NZ zzTi$0MxHc4d{9pInLmBvQxSon2a_eDtK;h~g?wModFV*9fVh6MHJcrPK1$AmPYdBE;M@3BIx*pQG`sU&XA-Nlj?VVdcqz+o(@ z=b0-JNTdFQW=h&rf6=w)&GzPgdYtDyjrL8KSBt&;f?Q2 zWBeZoAM~de4*qc;)P!Y3cA{|E7eH#%dpBYp8nCT09S@ZmKi+MC&nqYaTaoRhanpAl z4rsz0xHV0xw<14=sbja!+w1o?suRW*5INjHC7q2S$pt^;0_Az}mM3TsQu}l=iQ~Pm zi3z=49RyYoLf7udF;mKyI6u9QRgj4S4L^EwPUQZLZKKdnxbf0$+LDQsEE@t+e1TxO zWk+GRu^~!GN1@ir25B0nqeCDf$}>STck*|sh_7yi1wM`ck`_<}j4!5nSt!44D-rVm z{wCB)MH3-(6=eI0CvaZyB#My<6#+9U*LV6m@@=!p4VWi1X$N3nTX6`W)s<-hx^gRXG?%#|6IpuLp`HWf zvKrpQdQn1`7$89IxmeL9Sm3^hlwCMbvzFs^bot+UrPxPI>NX&H{hj8KhU4$a4fIg zG0!D#6RX2R8{xhQk}+J z)Hj{uuok^ae`crJ-puPUHGf2CVm<|A{JL4CZ^KjWZ`!jBcf)0Jfv>!e-tkRx8Nc!& zO>{x8Nqd=yH5zuO@uu&GzOPZN=CdC}sLR(T(a@aa80dY+A(5z>I{ZgWU_V!hf@O>} zt9UoX=AT+)EVdZS@fQ$k1`(3HO}|r;j@F|!IUgqJZ9I)Su&Aq=d)=piNWQ{;BII#!!siBw>rNQ>&oa6;i z?l22G#^~!FF)X6@iQije=AmTS9bNM=#3rZHd)g@+Fqupg=;JaYGTs+0V>0~)Gfetv z5v_`0+>NWn-V3y~q2H_x7!(M)L2JF5OZcmiK5g@oP0ua>+MYv`FfWUMl*KePOh{Pq zsIfiu2kdqvJYhFSJ$LwzL`bqTDl|Hm8@eE=+w_s6Qtjoo25}P*Zdf7+`9+sjqdbo7 zyQdvFBBTNlPgK9g-IocD3QQDTLi>ZAp=F{sLZ9db`kYJQ(m!puB!X6jTF;+`Xy)~t z2p*eYqP(G7KFu?qMZZ@uJbzp#@4aW`2_wkjsDogIqODdwQQhSD9TbyO&j|*C!55)q;aZ-|%r`CcYl}a}WmO`2ag@%` zL8Y@sdeEHE1iJHmLNkW!l!*xB-@J)Y4w0g#8vHPStkw4_f7qA&gu%UEd}n3j0WD~e z!^qA>7&y`WeVs9{g}P{xSP94tW&AToWd;3_#fhJb(OI~Z^1amgln!YbA_iqX-f=V3TiaII-*jU06*zRo0~!z7hA`Lg?3hoiyyu5qKAMcoV}I z*aSqgDt|vefMmaYG>AT<-z6_inU>-7lNA|?Zp@fTBw{cZ{yV<{r^QPG+7+gDsH6!l zD1a|r5E34J!_bXUjNg{o6=WzgR%CUZ7BhtVHi&WyYd{Nj-Vp{f*=ytf8gI|E%-?fr$H>hpqTf6@%7$8O|DJYxC#QI zh%KTZAjg7IRZ0Y;tDs0xK#;B|(h^j9Ne~cGkRm7u0YdL2BB2FHL`77Llt6+BAxdu{ zQbHgh@O$EU-}8Q-XMW$z`Qywu^KfVHy|-L@?e2E*i>CW5I2CT)?{;NxyLuWzQI{`z z>b2v2$dwS)1^-hW0IPIr*SG$qvhJV*LxlT;ds-(G_lg^S#*|wwj4*N318-jbvgh+l z{f#J)U8HqjR&KX+uUTLo@-U5W_9wHR#%P6pTN_xc5)1E8G!d0=qr%?^a5g+l*M#vYtw}_x61ub`zdS09WJhbbtf>W%=XQR}|sHfQFTEgI~ zH|xPO_mg)ci-sNU0-#k&+Me4_GCZY~M;e$w_GSq$-4&K1Jky|TSbo_$XomCYv`eXna zpIn~qee>GR9|worI;QaINti7#5**%n>u=f|f6&6Nol&$f%nN)@%Cso7-YG?7H2@{H zdfVvMf9HP!^C|eXrg)mj%co^;U%$9Cu%ktfzb&IEU##$`e0u+>sfGvHsAH&Rq+$B9 zozwkT&$asuabuN>w$>uXMMY0>6M`z2d{j+M53J-$pGf-2t8F0% z0twc$F8*&Hw||D5e<~`S77S2tj;?+*`>4MEOwvhy)$keZeVll(%iYU1-IKrw^__jK zKyZG>!U{lD;)OTJq$gM{|{|q+RI(#hW=HT|omK}QQEAEiF zki#dR9^@y`@;VyOLI1bS$F6vuDcs&M@;F;IC52xO>bs*WB0kX|17J3#wK8rAC$8rE z$4$O}f5g=Ea^#2ICW5w$%H-29Mc!3Upy!`5HVOcMK;wL^(m#Y#d%@`4riawixGLW- zQR*m@940idGw=MT();Dm#yRcf@4xYo-vRV)z{11Ma%9x!q57%V zlr!1;_>+axexAi-r!{8>(19_7IV&riA?9V5$3WrX%#B!LqszxD7O&E{Mv3hq{<|!; z#RR@E`XsRr{%A2Rm-wt-?G#T1thmL1jz_$hjhtIsq6`!=QNIbla`q)n> zM&YrW_1jH{h_OOjB6XE5beM*)*=6_oLzT9hC>+c zBJlthq+|6uO~{)OqnJNtuVY#kAYQuV-iTt~# za*yPqtA6bXc=seJE>`lB-0@EnQNn_9)Wd6iwVnW_^7HvF!^U|=%80;E9Xz9+ntHxk zD^R?PQzw|)+6bR`(>Sj(GOaCRd2eV zx)?2-pZxWn$=5WTeRBXTHZvn*u4LXZ@UE{a?YnH1^YK@Adxf@a8-9FBpTArTpjQhd zmOcdb%1m#4m;K9Bv{vHq)^35WzZ!CGjQ}@2eeB$p0R1d%*5Vm%Z}=A$_;Jt_ z=?hvGw-?@J4_<7(^X#w^KrP61;*GnJI>&NXU#qy-H+IDJ^|F3|JIxgN-gL2s@O3->*SUsM05i&AOJce#5& zyT_;fkm+#EI=+n|Gbs@>hZ9cFdRVcsI$mj~<=|kfT2g)SgfdLx{8| zWmh(zxAA?q?_$i8M@OH5l|Q%2r7ZD+?75_J>u_d;!v>z@%EhtHv2%6%IO~3`bzR?C zRcMleh{2{U)C-4iS>0a>gp#rY@Ezcep_O_;vydHw7(dOv)&Z~3{SegkjcV|SlDHdpemNbwJ_>!HD&EnTatI^c$;)u*j0LxJBW z5E3}f;1D}xH}J2U1P^bDsuVdds<3?MzK#E|t_&$+MmMtRyZ`7njUKWzT43V=ba4!f z$286Q%eppDQEU-~Ah~VqcLQxX_oVNgvPrm9jom3izWl8fxqu#f5McQ-z*SgzcQGP$ z!q@-Dp8mp@s){+;T~QR$@^fo|&%LvuCa_WvH2ouo88I>bwf39WH(fthi%75Sn|~kp z?5xP(5A6;O)liC8E02_FiNAO6bLmD$s%2}$e~+BPKQM~Nv-GuSToga*b0kv6iOPlf z`Qnzw=@3-Q+S|N(K~T&o+wWepc^05FP&{e)S|!x$gFo}`!bX&ML|!Ps^2dJ&{&?`N zx_HQ2f%L8pJyWbZ_2r;`g^8l;b?v5(qtVHS#I+!$ZxGk44clJ@9XHc2j}Zh}i>omX zZvu|`sUoBAyuF*9BeWe+4L(_8oem^UkTF$3j{$OgOfo7 zF&Q30SZwY)LY!@UXZbR2qPP=+wZ|B6+08jJ`RCDzZq05sq{%WJIjvOGHk(15=sd@^vG!h!Or(3VL*DfeP7A+}@5I9|ETS{utxZdB$%;++N`MXkKgbO(_?I9kJn8J4 zrZ!7_zN@!&j<(#zYiI!zb6rU$kWpA6ML0^|{!Ckypr zw%aZeO!PTD<3Rb!8yZGLXo9gliN}A=PFw6b*?pqI^0!#y{`yC(4rzI}6z)?D`AW)H z!@sZp;alHr=S37y@C56u8Qo#6)*a}^SzvhXDK0Wg5m%4bT3GSXG;w986Ye+YRcj5u z8VRQsNw9eYpDc6>V@w$7lIcR32R<#FGeHxO${H3^XI%nU#8+7lNQcd z} z+a*_ab{-R_E>C0EG^aQ(JP%fP<#bAb>5aG9y3&Coj7s{#i}9>**;WyiAdU6$?XJ9T zM}#Ww=PKc)U4%PXMG(}SvJZB1dXvS~G*CkSsC8}7rBQ!oX=$V-q|*J+_rjN8#T=*c z-4UZ9pS%$7q2A8X@rR}{vHzUmKTr3@o+rC(oVdcdgW2~=iNU{`fmiCM5;C?oOyIG! z&YV_3)5mggUsNd5L^k{8{lTP$-ZV4))ds@E#?p<%^he%)f*^?G9a&51mXkAYEb6j+ zy-6zO;ZmIGeqmMT8TUi|rNHx*-ac2?I!fw-=*Ql)FprKu`N2!zPnpyn2V~N?Zn<{d ze>TytA!cM1zcDcGBazcEQWt2Mw3eQh>$(w1x%i{OXeRR0(6CWt{Y;d&jtf zAhUh#GNU^N_o>~eu`<`w@X5G{6N9m)V=_>z(@C?$FNl{GDqIo02j@mHgqz?x6vgXg z>1io5{lxrs-2bINfP{9X8a&DyK5iKSDa@0D*f|AxEp~N9cDI%C*y*NR7SBoP2uoL= zs4nc+O{1ykY`7C*H+WtIkT4D#l8{$m_KCULw^>TxWd4QEnTi|DOV0-$Z?EZ?JCTH^QQ01P1!aRRNUaQ^~zYEjU#X+eg8jKGO5B_0(_0e#=@|P z$9-MSsG~YLe5Dp~#Ilj3lGBM_=^|{6TzS#1s|;Ogw3`jtC?M;#_UI~KhI9-q1rb=0 zYYkbd@c9G+z(}rtQzfL5q{o?j$ux;LayRezt;lod`aNu#al%B~ENZu1mtKfBTKl-Q zOY-j<`?e29)7;&{S7GX%)8ngs*m7yZ_5+mJ|Csv!J$pyP!$wy37h<}6lkkk8{auO( zOMQ0S&Y`t1)?1j*#7psH?RhML1)mKi^jlzmqF^c;3lmwYty33->5+3u?1HTzuWqB` z6MJkhy3B{2Y0`q;4=Qei3qLZltk1{)ExHfSVGd!neP4e5S9Gi9)d)(a5C~w^8P(qH z$~A;FE#@$Rt>q*wLem683Zt*{r*YaOSS12jCyN&9LBb_0`n*r`uVf@?cB4-p1J^XEad$2RGM#n=1%G$zV3|Agm$cL|Zy}KI&O`Pys@_)5 zg|3sbCJ0-jC{=)p@lFpsUJqMtv!-(FO_sg?)^S1ACYc9R%dxX{&}QJ`Y&e*hfBxuy z?9X?;{SnEH7Tvl(u3izb7|FbgK*QFNJ6m7OPd+I`4>_?-ko||ki8@ubG?bJqim%U|e)8iO*%-<#-{C(UM8yIT-9X6=kP=Uw^^3Uk z|90t{1Rrbz0=B-4%AA0h@yQvOW9`I~BUyellBxv5py!7jR|J=p*fuh8Kc=eTZqR_qyn|pMN&&|IRko{{{In z3A7;sf1o>BkNon$n}!QAj*bs%HUz>qcYgS$`Y*A)MHpc6-ZkTUmI{SHjLj*YUkf-- z-zr7NNp{?IN}>MJiWW|!Y`{4Ply@5mHV^WFLbsryl&xcv3t8-G}1}DiBbCIYdMunQZBO+ zCKD>$rb^3YH~%X%GEmtZ9q$w!$|w{B!32(l>gq%|n7B!_87CgWDf5=+;u>&cHOX`R zy~zLLehxjh_Cb3$oGhEHmugu`)4pW&+`sI$k9!lOqGr>FY{$N=b%-`hQ!7SJuI{fcGgki3$4C37>M@A_xi; zcdpL6)&IlPS#q&lCdyS%Tq9}V1sp%)%=BLG*jSMzfN}GQ;}*eK>%~_c=Sm*4hO(?V zM8&?vg3=(%rrC@FuJkl>Of@ppADD=$VIm!9d^u#6^Kq9kP)T{)-5D#F+i(kg+q$mus2eKZ;x+m-jn+`bcbsPc==dgOw9WbYbtgNK*M>6w@#NAk$V0kgoW z?~uj%hSutydD6-cU_%!n!u-x1j~@slev^Seu)i40Plp%VRpIyNzv}|sLs^b=4k-~{ zq8v{jE#>+@!^`VVT_R-Q*T!N$yq8&iJr3;orpq;4o*7P1g{m}-rb=^@U=M($o~m0? zPcyEs9xQy`>_>hN>}*QkL8X`+y8mI=?`J<6&RXtNe7}V!4eQVu>Y1hE@l7Mr%z?of z7dE8_I-BOY*6!+yTX>09$~yUozmFOJX8AY+illPU+Z8yJLbW z;fwbQ%`4!oxaB&u1~9J65dm)bDV8X7m0Rxz{O2RH_Cr_|b(tBi|Ha2W6t!J}AX3zT~N0VLoZlrmrcOaUx)s* zi1oRf3@^}(o&G8Vh=nx=c7U|RF7BkMBZm2c%4p{Ayr$P3{jxwX5a+Dipb~8-(4jz% zgI`I&A2?Qh$K-=e%pkR8OeV(D@WOPLHImaeUW??-E_Aof-cj{Q(p?@H^VjV@JW~pM z>0+(71<*v?UX>-S6Oen9@vZX$()(%kU48C%g1p}R)5Jg!hPUju5#*ofKEY&%W$YI_vk?q9QI7UQ z2yCzNy!ehk=8;A4rWr5Ga0h>2HU^FsP$}bhD8|(ALbE>B?{RujuMdBCN9Nr*?I6*D zfWbQ5rF?OS%u=2(gHp;fa>Vn(K6gYenM7ia1X!m8O_!HylAFE-0(md1GJy*|5pjv? zpSzen{utbHGfZ-NVqb1$biBDk*44tyyD&$cZf&5+El3H`Kjdm=&O<~l`cYJ?BU(Op zeR=%RF8~%06OR~LDoHqO#`Vg?sKTbq64O6>`;qbMEUDN%v|aqp2H4_9Fz)`m&ayOp zURuY4RYwKZ!|YUmkD9=5+nne_0TSfu>dvj_STfPx;IJwAZF_8vR;@kyGb9rMEcvv| z))~O=9=_O|ak8v&O%31Ubbp>p^%H|fe0Un{iwa7US0zmkeayQh($V&sG+P!pu<<@} zMO=q;i=28~e>F|N>A(QPWwmlFPY;ljh97(pfnc{XVcW-CS6{jwJa?+;>jwVElIilyq+XDPZrzX*19k!^*k4_kqQ?U~DwS`|;Oa(}%+89dbri zr|a~MW8%v>q&N<8eG0kXu3nyoV274^9yKvKh~$a?_AuUmwyfT zb(f#dq0^*nb{zaQd3`87&!{ufQ>(lSHs_yE*;A+2lzw?yh4-9;{w^Xp(ED~0przpl zz^$c7NV>!I^WZvNfJC@|CKugnqodqkpqPUnbHo+*EF3Wghmv28PnCQJ_D)?}MBrBu z+czMp#w-eVN))CHI+7zrU-`J*+<6KP%s^2GHmCR8N(5}mvY#LHK^g*sP?oLSz}~uH z7GCbR5X5&(ue`oz+B&*AGb+RPdp=d<5x+(`4i4{6IOXv&DWVdUR4wDm3?n-ps=QvqSyz zkd0OSjfwVa;IJwwHk{6eA!SrF#eOLkQSgx)sV_ZLe6bIlaG2~D@QTPv5C0-JC{A*BQ64j>2SEsgxqR z`xI>28tDL+;lC3m=NxpQEb6w`r;PM!EUVg&=BfFj9%|L2=aC?NeC@7A;V?k&To`8N zMa=mB#pL+Y_<L%cy4gB$3ecgg~EB{ zNZ9xB8(m?fTlcQ2286D2BR7~Cou|E0=H=nT^63nU_|Rf5TPeM|$47E9yuZ?=&S$W+ zHIiG?k_{9eJ2PZ9Ryx4!mI>XAE`J%%OF6&q#%Q=r9DdI~Ief72Hy}HscK}=CD_OKZ zCK%79C4_JH+*I#Jyk^6PXtQM3+GJ;?2WCmO5Zci-WxvqQ2j8=bDh=Pu>#u%pewP}c z6^Zw25!LnQJ^%vFjYu9w=aAJ)V#)9t_oxHqZjzDGgza0Xa+};e@3dD&D^p+T!i4_EaoqwX*&=@ZR z9w3*EtlYVka>Kh~b3Vkpa*y*nzN_1pZ6*br^9#E7S>9O-z4>&4c}$Jh!)5w9HInN2 zt1*1>M!(ifRc(4yQgoF1Knz>ieDT9ILH5xxNz^qQjM9$w5RZbHIg{lvn!MH?TV_^UVKwX-Q4gli3NP!ri+vtK z*9$YZTk)}41BNbbpq%$*7aLA9S96&+z8=5k*5sXL=lqN3yR%Nv20~=vVjs$ft8S(f(_V#hJRp17bc{ zhzt+FG^dr$ZN1tN zblIu~MTfYyM~i|Wk@K&YthuLt9r!aCzP#sf*@;Wx!PWVOu|i;yvs|lVC`-|QhXUq& zB2=4(({?r^4KCL=I4e08M71TuX5Bk0r~AWM)|-tb_mO-Yyiba~^Zs5qq00;n3+*UT z{J!x+eBG_X2R|=`ukpDduS_m%Gj{%5VP3lfKHCBJHEFiB90KlIv-b)Dg(Y3tT3Ic9 z0HXog;c4I`@N9vWdo};CLFZL3;x$XGwo?pBvWoOJAC*nIZ;C)E?cZ3guRwil!=TfT zUAy-jrD^9FyGvVzwz(zMFm}3ui>fTG8%+>u3w#;qO84_eP%+K8#%ubqI~m{)P69=o zXYrxo7uzfHjKHrf@}JAd&xsN+kDhDJ_r9FL-mgoiU$sv|`7$4iL-b_y#DzIz zY$RtAp0X6H8u9bi=j{5AB^?`6`n=NdH00Xo129381I%k$Z)ZLU@ujE>7$8lQThlZF z-*ltr*=}h?0=(zhb_gfpWyC`HS7xl&NbuTSoR$bske;-#{ zCM&SOojT{&3?bwhA*EpTpoJ21JawVU%{D?Gh)sup5$vS3U7akz$S^x9`GR=(7k!;US8*kR>a&_s zfMw@ir*t9MTaE(33L)Kc!Ya<}1T0 zGpP%{@!DKXt5-^LmIzuqd8+pz<#z%>M6L%=?$n%5jgDHrex|H@!T@GxUo_H94koC3 zvRlK6E~lA7pj#;S=J?f$yaK|_egY;f1B2$I=y63e)cp(nBCd6&74JHa*Y_r`Q~$za z=_VA6QeSuY&LU08M)Dq=lV>lXT}LFz_Fp5qnPXTk?31gGQr|Tw?M{!4v6|IVXm1IA zn*+AIm9-Uw&3N=Kb9v$_e(_}4wQ!hTGtz{|@RX&8)44+lcXF@k^7Kv~fJCBLE`UCm zm9}#F(H8q9I){0)UF)+bJR<8--Y<2CePQ$z6Yw0mUcprk z5Ke19FYpU!OC)4<>q)v@j!Bh#=1cdrwJU7MIDT~?pNutY_T&XQXATajf2uM(1(AH% zpLzL_q3254=KGj);bADaS7yar9+2I48#D<8f@!y#&=~~FEZ|o1QfS!IYj&9h}d$12Mvm(Yt&vq?u`xess!0g`n_7$EOM{@ew8ED z%~C>goF;W?1`dejo-0|)Rq;@(eEd^RtL+KWkh;`G-`-SbZJg*mN=FlOkxBy6GX|R@ zGlM(Nc~&G9(ZK$`&t`J5WD}UyY^-)>NxFBe$i1?d*BhMR?Q3q8|E-9h!yJ|L{WC+e ziUEKTvFSMP`WR8=J2g-prx;POkovnSlhf1O!3jOZt6rHh&T`qB&flvylQAckOu;TB zw`L&~V#!z`oI!>w>pHLZZF(j2jVh4cYaVkQ>uqnRAWkbfhV&x(SBuk!)Vs?NR48TC zxU(PA0CnqbungbGPu>8M&eyAp`WuVwbCOlCX9BqGAI`6C4$)4 zup2W&4Go@#vCw<8x#o09Z$Da|QQP%kud3zsuye=Cx}Rm>%wq_WXNMa6=)(}PFTbIj zno8)<(9S2AmfqvZI)WGVo=dQHLja($rQwYS93yaK zt1-u^1i)h_7t3%B!e5E-g_4J7U@{txgaacgrPxw+hUSyT0bq1&0TO$N(RER$tXoN)H^;7d@o;W?Ds&HeLi@3U zx1}R}!fpQI48F!NHf!2rl0(h)a5>s!ZWx%Q8RVX{~PRZwD zthS}qbGXzSk%Vnb4s(HD(wM=Wm|H9fS08vC+-a zk^y(kJ-zlgKdm+wfbROi7zA#@(@53}9 zE28g?x}H4O@P`^xo=>xud53yu7)VK9Qa^zKc=1Wmo62|80*SVxl7eZ$&Jfk(6wF)% zTSk_Fm2{fhIW8~W+nX2WaLW{|Nd`WW0HAZ+-1IBg=v0CA1=>!94-vL>Dh#tjp@^GB zZt(~manmJ(elW&bf$)***Lf#YePE3bcy-QSVlZo_?0s%16M93s!iQ>G=I>V&A2zE} z@2+BOtkXA|N5)ynk!vFvcx1Ubr~KYUGpAzne3S5PbwO77bk(f~VTg0nY#o?PU0=7c z%tFc-DyzB|SNcpwaRrDzmoIQyt3fs`Ku+Sa1~HRq_oA8iXe=7x)4Z%h$~I|27=VBF zQx0tKCO%6IGA%fGCb;pv^#0}qR!Oy#%^+Zg?T6$qsKEj(pZ|uN<{ApR3@GY|-#Od^ zp&S?bJ{!-V43CH+^Pk?qT5p$fTNK}3VyhqAYqMi2xS|m0b^Mu(xEDg&rYz;1sE5rH zL86} zJ+hp9S#O#7Cnie4-L_*4Lv^vG$cbS1#4wC7XbNuccUSIuket2y)= z=hEfHD*QxKDKX}fuOZ^Ey+ftNJ_dr73kxC{=HOtc>q&HF7gg;dhS~i#uNooabNw?v z#Tn-t(pv^7M}0=AVi8wphN!D>eJki`49d#V2j}BvFMwrK1LzP3g_L~eL}mxA6zYj> zlcw;9BXSTdyUbpr&?w9SI>9d_@BxFO_-X((@II`s>{^7t2WP4VsjsO@&m1j3{G$#H zgDeI|vV*6J+bwB>T7-g-5h;4(z}=3W0!UAxUj9F+vSs$#OtN)prACozGMw%>mB0XW z+)}WKdy{J9YG<&r*o&a+NR7@yKr0T4P31~*s6}^bNRWlHfAAi8uoiv~< zZ1iaPO5MJ&0DW<@`EN0Na|~)|8B>-BuhUS$P8PJ^?_v5-=HTpRFh7LvB_1Jrzxe_KLfiR_E{s)*9fq>>j(4Z?2}WZ_=|qSyP(21jfxM_vh}h zDXMoS1a=Xh#peTY45?>S_fJIT)m8xZ#>PF(yX9|{FJ)P3Xe4G-tO%^n$rcLSciuB` zRsHSauQ>gPP}@-N#bF72V^8l13Lkk?Nq@T<7r7EQ=9UZnRQ-rfmSl(G<(@0TPL)ExRkk%R;YhZ2rroVTw*#I>JW{qxjj(IwlZoCNrDCb6Twu^w zLYq5H$;s}ZVs=mOIm$;NP&vB%?W;T^pRoq!?iBT2OTs==yVpL;&)$_UlU&j-sp(SG zy!(R1#?jNw=?AUp8r$<|?0uVx;QZ&5yA)!IC_OiJGNCvPgGVj6f(wnfo}miLe(9Pl zTQipDJsx_4gO*VB(fpcHT%P*z1@dWUMLnn0!tAw|tg=qg7*XA`YUHJ+G#e8E536RD z>Y)Lu_(D>H=2j3Sc_uoZkH{q4sROzuZI*bb$H+CgFh88+8{-BygpgS-bNycY6_;9uAj%t*!E{s(7KmH3fDARmO;J z?u*i1tn$zD?`od*0B=*!{}Z{`v}Fizb1mD@WcjjzLpGj2Y-^=@OQMd7Wj8daH8erS`^Cc7iO)pEJ{6mT?=yD3E@e~nb)!XTA$E4drRF|FpVb$04|7m@q#xM&d^7#( zTQw)ky04@MSc>#}tJb}UC_!o&#&U*mnJCUW9}Q~eppI2jU>V3D`r}7CKl^c-$`hAB zuZp|qKq_YUYG&xTWC*FGtA^tB+8!(b{NH^}gsRJ_bu{75%cVE~{ck6bh+Iy~lt))2 z0F2U4m|j811V_?|;Rv|HR*>kV3#T_jrL*&^#WyYwKOmZI>5$vVK2B|*5kG92DDd(D8E?FtmNJ6LVTjoo3E>~d3Z|Ij|0 z6A$}>FH`m%XkgByx>$BJ+_rk|eO!D7p7piN3V1JpuR_KD%m~hH+hr5dORF-ss?jRz z&a>lA`-%NUXTsTzZy8dbdLF(ZwOJyBa@D(OL+Wl+mt^O*M?&qYjX$E>p;=nb)7yLc zu?}EYDg^3}xM2011SG2*h9Q(eoVbJz1}nE8@$(`ky49UaK<#jC2nFa4$n?RU5~&2A z@2?7zw7oMDYYZ=hj~m(Xb!qcOu_SNnT`%Ug_4fB9PJ%c^h@Rw}tNB3a4~I-Q8`a=& z!9aAI(>J6EzydJhNFbzlq6~=i{Lx+0CFU``OrV+}(d-Nqz?_s~)1$RweZqj{HNMt~ zwoG|?<&Y)1)0L~IoTXI|UhTPB9OOxAH4O6BADzJF70me4p2b^64DZ!h7n(W{!DPdk zy+)2^hUI$HsYUx44+>Ty8M-4!Q#rDfJ6lCjPdmoLdCAg3&hfckbn8Ctojp-!=N5tF4$5CrhL?;~ zo-#qE1^C7dUeT$e$({Z2G#xHUOwYTu$tEc3&r-#}Z|o15W!OH3TumI0PoV2>d%IhH zsHTZxp4-y+^L6@Z$v0CM>m&or5l|6WGZnH^K?NXYw)g+Q9(-LdMVq{sDD+eV7*!O2 z-t0`Ml9KZwo-r4d=0KAw6o>U!+Qe0sn}=8^vS-sC2ryT0ILUB+nb1&N$QsgcE3VdE zH0tWuq2v`QRyHNNfSHmxZ)-KNDwr8diPj3fp)Ui{{E5#lh z$KKB%g!u;Cjp`o=3&QPMelQ5ilpub%Q=I#$KpfkzH^{8I?$WRYj^=gHD?Z?Fv_k ze!heidaKSgiV3Be8^+Ate=elZ%=8OGZC>Wn6`Wl15zFM4iwpURS%L0;kcxcniBG{g zgRdJim-!@$cBOcmjh>33xaLGk3Mu=p6_PGn$lIA+*!p7Qhi=~qTvo)wD2uz?x1ZT(G zK+VL{2s2l_qGTQ^aXJvWmsWHZqV1A3zm&^vk#FrAoW9;bIh|mn7QCbi;H#uwD;SJ7 zdsn}?G0O!HjJU7h!#R+828_HFM6rxi1oFOMC4}eGQ?Tp3Jhi3OZu4yGCz(N2yKRc} zaN`>28;|cT_|G`fv7y6zk&Q>55b1|`(tA5FQ?>r3I<%9z&TF$mps=eQ_8k}65;c`| zN^abODDxOCRN7p9NaSRsakMDUWg2IMjeHK6tj_El08XCrss+qKlBhRT%^+aJFSc9M z`@^-!gndKx0$1y(`)rCv@?ag%Y5J?ggCKX$8r45DibqF*jDr2TPeh?_1Xt-@nsPw$ znrX9?jc-M1n>}sA5FvC^JtQ5~+wX&2aJ9pGYd%W%O@(7Ct}}fyOP2SX39D}P>b~T& z8r;yKJ9j@(sDgq(Sy-A)6_Eok)I>keZad-S<)z4~)%k&9tBX`@wikQ#+0Ws@d1kRW ztZ$DEkX6L>Ujt&>Cj&0pm94H}RZ$mWH!*OYR*TCGco?6Tqk7IIY^vCc-EO&6m{DB0 zbPJf=VI`*vWUvN*K^$bv?5@wmv*sS&qud3oCC+E6EQqdg4~3f<+NG@rgRw;wD0+RR zd~S*kbh%RTW1w$<)2L<4h*u`!gMohC3p=hyf0#L*eK#kNl=Q;@-2moUV1zG$o(1?_ zqYdfnTHyGYF!R9K>jPy{Qi^W9%o?~Ik*C&oz1A)un@C7zW$8^gh$;}C_4-T~CbgoL z$xIyF6>~Jrqu-NwWp|yIUpkNz;7)us<=IGYl@~P!9q`(JnSNcZta}sgRlo++Tl2*_ zYLacLhM`1)`(=500S&mkzZiw?rFgPrx1X#dVHZ*9(Y~{#JTMPX5YAxz`!g^-4laBt zJpcP{2D1UEUr&3LSI*V+?>H{)2>Zs-jE>h+Xc798Ahhe1>BGERf1NG#03eGa+``-H z2l}Kv^bCkgH^OQ<2l9*(``F8%HCP=M#x zov((5&Z(FKmoOSXo`3hY#hCeo4Vhe z=+R!~U0AtVw{#`^lC;;8C_Qu~%AV}zr}M$S>C zEaZ7-9^_ToaN`;8FUUOrYndo|x z37O%s;Fgsld0nrAhfhB9QMDvNDZ%HKf~}F}vCkO0E;IH$@D3W_GwCkI@G9$p=#KmN zL;#72O)?+OtJfA1wd!XA36HIGD~f&^h62^IfDpYh$wOiar=h)`6BL`2JQpgLIODp(X|>yEpq987 z@W?FKmkD5=aZ;?FJk2l^sMIywzU)d}Cyp$!P1FcW4S9Yu>nh8PLOcR^`A(Q;>Cs(* zPN^5cWu|h)=^4GuVmP>$ezWf2@G&nm$17hB!m{lMCf+@~+I_merhnm@c0D7!$`dKq zp-I*;yr3=lZoWCQ@%fE&KAzhUn9;C|iklzK0T|a*Q)^!?<&B zGFQPB$W!;r9#o!R1Xw6tvm+x@w6CM!*s50G=PWfmDor)K@N~UuBo}C+Y;DA0n zBK)V*as+6?1#>rbvtvXP+76)$CB7r-x`iEjfE2FX#@5#^YqR~G#xk>gM$g~D8x%eOgEvyzhTdizitTt-Bhzuy9SZP5p_TkD!2UX?m732!0oF0 zC7YimhR8L*q1@Yn078<5Enfw=$<~V=U2PKRzS`O@y=J*G`v*Ta{~5Ol9_PnxKMp|+ zWBU&$bzDuDB^2V_)f;lm%hz94ECQ4c-0DDw9_d6;ciw`SU&#B@am~T>YeV4)$q_y8 zE91sLL0NMyU&wX<)p#7(WdOlc4VVM8vG$1ypHJ@+VlR@(uO_ru{*)lyJ^wE@ZA7CW zC|%$z$wcW5cm`+DLk-d^=Gawyd*Obrh>*SJ7+yz`dKdml?|HZSjA*X$pC#v$fc_SnvdIS}Z9F%P0)rH%B(|+pjJ-`X0T*%?Cl{>< z@1xAi_0lWUmIjh&eirN1fKnyi!Fz9b;*{3xJ*$Q_Mp=WLCI(d|4nWn$KNcg8T3Gd5 z{ObNE8u;WQU%_?*wX-5ak)~{GtDa@&jC+x+$#sr%MmX!<59^BL;^`2W_V_3rP^jFo z)A6GOzJyfh{BBilM6)1B0dum-?cxRc&mS6pe*T0Z@Oi#%p7>GoSMG(W_fc2*k{V%UW+Ebe z@T9Qxj+3cizVK{+d&i#GxP6u92-!0cBCa;XA`%lNj*@+VfePHHpLPo6Y z_C&%ciTQj)u9Tr|hlq}c(%OJVlM?``Vd>x2qmGZQ{}pLV(-H#FHm70*xs_dQ?)b$w zXc?94%dA=(=`PF9gB&*o*`aH}{=%Zi&kmy_ardFT!R5-9y*5>Uy`TBBTKc-~H;O{h z+6rRxBw`)N~wES`R*`^|kB=_p&p1N8AG-iz)z#MejP;rb~azwN|s z)n81(CZNAcG#%~`Xc{8@r|E9tgKB$S(E4$C?|cq>=w{9{zqL=Sv`@Kq zJ@QeGxBpB`oU1q?=S8V*!er;WwAhd81$K2`s*zN94m;5Bf-CJRAeK{rSl0e677e~w z^5A72qj?2>r$$p2&nAx#t8J-y|J1e|2WZObYNn&?xwSA)2kF|s&p*0AV5I<`j%4Q< zwR8F9sVW_%e}6a^kj=R%C@JZHO~_81@9{IxWUWwXvKqHlT>g47$DtyLSNbz$_z>5P z@!f&Bi?(Lc({f|AruVa4Hvd9*bpaG_+dz}9vXpJn@p5s|uz#AA|AS@yLshJ%*p_F!^lobtK zBqR|^WfaBbnuUhUH0%+Dw-h2}XLW^Z7cOsGL)ns*t+Hh#BSgRFx!0BMefRl&|MS<& zd7ale&&PN^&bdh(>`syg-ACKg^$uQFcS^K8^zGcFlec?l#()H|op&>iaKT1>g~Czd zhUGMoyU1Pe{730F4coWizFrHPJbnLVfCT(R-k0%>o=<&Dgc7hhxC*nlFO3^E42l_P z+j|kNeA?$Co9rGsp=-96fA*Qc78j4FdU0QAu#sYjr)69wf@7IV%R>WN@PRB@xVQXJrN<&slA zR+E9`LJp#S{Vj`3IpB;n2mA4KsKyOg-F_BxXy1vkPLbTq1-Ho9*LGEhe=Be~uJ8 z&gZCQG(XaqCM{{VeEScHuznS1xMG;7pV_&ElTd6J6xFc_cXj*w;%@_W)@Q@H?UDwg zWoI9WDAbK6e~BB89(=k(r{+V1e}G$MhEeC(>l}V*w}!^m+0>;%*$Wt-U~QfopQ}fx z^Fv*W6}q8MdgPryP^jlSkxdY{D?XNS51~^GxJzq=nyz;Esjl*Y7T`I?Ua*7p{&ff0@mi^6t#c2-F@|sOMKpILTJEo&0%x#}jk4daruQo;_;b z)IVbL}skJw=voB2KrbdQU$$)Q7pZQ@23^{W&Oyz`^%k_TgD zXFtFs@?zhm-3^>LZ<*w%-KW*pyP?3X9_Dd^J9hSc#vW<6^*&L9=Sfyc<70vERfO>YZn3MjXR(`P=6x@G)b;pSp$B|&rV?ZEO)efSFa3=rGtHQY8?d+P#;{S= zB_Yu;r{5Ol)RSCS~PJN@jTApm@Z@;WB&@p6MFcIo{GJi+Wtr@r@y^c{F=;83@RaM)6}kehm81?@wO zf<74{FGnI(0zW?O$Ifgj(lFx?=?_fQqQLTo*4~hSxkS?D54LcyYu|?JO|U2)RpOhq z?A_%mN3$LRU_EHHwVJ>Q&lcyPzDIvNhb^En4Dew$Cbc_XCR{GfOEZqav z4a@+aCSktHTd6mGIdH(Br=h!WT<{I)f@}B1%KE}6&zW%$VU*`!lwn!@4nH#Ly%G(( zDvleTJ7_-RTO&negOFj4T@8ZJ!(lHuX)c!70hRCS$;a@i#y z2u0QZd$O>Gj*0iCz?EHAsY0?Esi~5##1eUrm=;c4Dm4v$N z>~qFRp@1Vxz&E#ULM6(nFC@C(t|2%f-+dTOCEi%;$9?!RJ7XOIk!AYQw)9i`tarrV zaTd>_==fbdCL)V?wk);rZV8lcGjWJhE3j-;89!b7E%8&dzNjaNh{x!x61dyPwstG&;;LSF@!W-*Oyed&aB;x_igqG zooI!7lfFw1zogN1w;rQ%@AIlQ5`RPJu95W{f zk;gea)Y33P*q!2k&wF~W!(_W|arf(<;<3MtpYrU84RHTpMF!}%E$Na!wV||7J`y}v z&&Fm+qf1vKki~;|+O- zp30+>sh_u*2v6;IFshQS`EdClKkrdy@vQA4%_;F<+D*5(+E4@1g*~LYL9kYS0a?&& zgV6Yt?V2|+qNfgpyyI~)nWBB@N&YoT2u5s)5wMS%Q;#ILurNKY+-XEdZG5eSN3Z2H zkbf5W`PCYMtLs@0KYYrVVmx$5@jkoE*fxYx(Wb!i@d5KFrDG~No0L|YP63vJ$3)Yuc+LF2)fk3w31tTAuYU_F$&VXs@!4nKP?5CXQ;E}Gw^kc6DiLqh63(R>+}Casp|E=j zxa>BcDFG&K*<5z?#hB{-nvFDrJjMYvR0`9j+k7{Y%Vs2oagZRz{Ug5bsq7#S@!AlJ zbppdki7cYJhlslgJXU+8*{JLB4en#gpYB>e90_&xIJ11O>k`JMefS2RaFb~QHb=i= zGqGFuby)%Bb$ON0SFdh1T){NWeirQ^Y;WQ}LR3qM^SS2|>7xC+Wc1*ewC|A%s+(`% zQvMT{yy6Y}%8r{t{hStj26d@Kc#R45g1@r{KFQWZSD7A0I7Q0G(sHwhEz17E=Y$NO z?LhAN)XH+a=Rb*oz9jE;l2&-?2QR~zK7tXRJ}A=`bOJ^wuS%z% zAdf2`jWNL*@p=k&K1eq1t2)j5$lEOtDXtUEaH-GPWwxuRm*jVn;`&!+J?8HEhqb$H z3HG=GUw~qjC~I;lMo=8?nM_ntkmTiG!?tFfc3A^Q3Se?^a}lDc432N#bIhMcw3_wFpUfRfZLFSlBD z6%>!lvQ{6BdWyrNY!e2f)MruAoX0hb_vvFs(M;q)mH-=*-Mh7zdIuhpgollPOfav2 zwY@QVWmYkWOhCv*PZDUa&qiz8?8(_{w@+v8B@k}P9zR39vJZemchSQlUGo7vXvr1J zz3aB0oM5duXLb}oJo#L_?tSrak?xqmPYo&-%|yQGt-ujqe}qx3+`C<#W>h*bDyyl$ zwV1c-Z`JO$P#ft-ZbtpDJf| zkI|gT3<+r;0n&~p3W}O-C|K+!9DubV(|wA*f;#;diS$|ayFy_?kkChL;9Ir2s2T6> zl#B?_z770ZDJS_U>V!qDsx;88@{p0@;Bsl1f6}%}(7Y!zJd5vEAS>#cUf-jhp@qb)CG&&TR`N)N+tC{mGw5 zUWREBSc67r|G zSs>!pGeqek$aFP)g`Zk^-!Kh7ozX-Q_J6zWYa>q6H#A0g7mRyJaCdof-T9w#V=VKk zEK!SscN=s}D~j#a+xRRqWVmBFOdR^60}qkt{>|b4Bi#p^w6aj9RhKPZ%3bQ@*tR0o zGaR7&7X6P!6#f2tr_0JuQ@VB{M7Y^YclYlEy%jcNVN`nS7d{Ee3@D&QuWJ;o) z85a|{ov6^jhrK=|lKa!4w^F*MG|Jz5uI-$WmXW4y$@s;_@JM`TBOQ^NR290xT3b{9 z5)VeXIlbn}e04%JvLLcYije2J~>iwX|bxc`s z^%JeAtQAaI%XtktR<4p6-(I3&CIF%=St~vqywce$V}~Ea+7<);g#51l&Wr{PO>fyu ze(9n+kC**5O_@c<)GFsh`rh_#q0u+Tl z4ONa#Lh$8g>W6v3$OOFu$J>12R*aV$2IjN}WEPMnG3N|1cjj~S(Y-pRDM&X#&%HY0 z{Db_7C~$^ZCi#E8`JhxEyRVmq0w@DYoH#Z0bu09?c8rbmC54$-R{8z}d6(eSmkq`Q zp-b!XwI+6_d1u%bN$-nl4lWEi-`Dt2FP+HEu((fm6lkGa8B7YJ_WM@UaRW{yEy4-# z1#2@VShcD?JRuvniT&@MMIP77geyME2_J85e#K6`z&lRBPIMnot|MJl<^43=bZ~2{ z&92*2-&FZ1<5Q5o)rre}cpB$?Hg3_dmlBB5=#rdS&niNnQ-e47Y7!eqc2l#ER=Zk}Zkk!b(Ga8tg9I1y6naJXiz+ zee@kI2L|rBD$hT)<^;*%A#_omN+IDzIg-+DuTQOdME$irI$?KAa|xr>YOpMn%~Aa=>uUlS0WMSew_PX%S4uy@(bewQCElG zsy&&9q^_s3t%%i+{s~FQ!$_9B4|L^ArRYZ*yj%un*a;5GiBQR$A7(R#7_6U*vh(VQ zjd6#{Q_r_Z#(=-BpobK<;4_X!X}7b>4x)J^D!CIj{K;`UMo2Bsk3B1yPOLo8KXJox zTf_MhG2|_V2O2$>f+H(@_-7s*ar!Ee~P{MrO1aiIwMPBN?Ba^XD&N&Mn zSG6kK#DPcW_KpF&N#o>c_WUFf?g1@3Pw?<|XXfR5xSIq)huStUrzKj9e8QqRHkQT| zSmJyM1gFQ-A^wBAz_wSeKF3+?Y0-D$WCRurOfcK}z^<*xyBm0$0=!&(P{!-F)r3cK z6_>0(M7qxfmB&j~R;e?Wt5L;BcnM|rPLH78+2 z+*6vyvGUjicNW~u&Qum9z>Uq-yxTg9#KyTvLJmQLeuWD0KkXYYGbQCsot^YMsMq;{ zFc3(V*3A6P(nWK#GyJ;}OuX36#~B}5fE$`;R;MTa>_pHo`B`(Fi${pzmfE|E>?+cq zTVN~h*|yj7D%@3Qt$ao3fa_gsp6sYvjY1MwtpV|BcyGf8WT;86{Sa}9H;?Rm#{gy@ zI4pK-88tENM+?2|_K+owTUyV^K3Pf@qv!G!bD!FkTucMY+r0DMi*w zCe@WHdzK2BFxFk)rAN%Gjn_-P7N<>eB3V(f z`R)^}2l*vsYg0%45*|0}wg-xB2gj-MFk$td1!2ju7}yqyH@%rXw?mUP$m{NfTF%rS z`8F=wxUQ%3jv=XPnI$>=+p9G${OD|QU<*n2Z7!x!9u(d84B$QT8FNW7^u-ozx8}Rz zaBuE>e*h@-C*yMmK`Mkf|J}T0+(~%8jSyTrRW4iYDED2XS*cw^3jG@YQyY4xc*qK-Z<%@!cg_0WV zlJEej0xl8SP!jpoEY9`Yj$cNd15|a=-ZwI@8^8Q(Zngq~Oo4jI4(s!6qr=1C*ErTm z7d=|Dfx1j^9zcAQK2{bzUDdUT^%hC-@NW?54~Wm=hu8S@AFr`h;WChMHurMmeaOF{ zrWFhRp_UNL&qlG%+^1AinY{@6; z_uo+wy^EGE+=HgwrUB51GDIL2WvV@m_5dUy8eW5)-9D3Gpmrb%KdQBi3A zz9qS^Kli~kwRiB>HpHk!C~*7+8gS1RTH}AXGkU<#jC;7!sn@*oG1BwA1f^x#J5K6M zeo3f`+psAQ#@Hc1PRq%BJgXAu&XUvtZcc|->GTRG0vfU9eAi=pecbTd2<^tl8 zcfa8L&%l%Kys6a|X|9Ol0Bk^QxZl|D`^lvDe~Z}wrK#!$VI6g8LhiHTfwRn7Ot{4D zUP0#xDz5<$;~V7jO(+Qi1c(bR3-EHnzJ>a|ZFp>Bj^ue5j8_i2^L?MXQ z<&RuE(Cr)#R&MXkPud}W|6?Wr%5prVE3~LXAX}F<%5-XPLs>Rd(M?qcMrf?@DAEXbu&Xcg-@%lDkMd2g0uk1!Zq?$@2=%6 z)a#ER2kVdBL2W+^PIGN|Enb9vc$1{;2(IP?rEpy>G zqC1BpFO}YT_ssjSNQmpNd+bpFs!^mC4=HPPRMgD0z;~Q4PYXn5?FUZ64e`~|^FOlk z`!d^7Bn;kVr##YtZ>jmAC$rYn;v2^z;|&GOy5omGIZ)y@FtT{y$o*ew-K-8|yR94K zya?C1_H(}DOj}_c;`!^I6pU;zijo2&wXhMGY&%m{>f=_4gZW>!m&cEK{+H^37RbLP z8h365lPbOFp()<+Ij}RwS&B5ya1g<2r1aURGU^{B8unG3E;}BZu~J$lE{&<5nmyjx z0pKZ`?)r~~3xlV#uk;=^n-EnFF0$FC4U%^u17`7oIAMa+zyonHM=rt*39K|t&$blS z8P97wHGhE3$_sBX9MO6asvP)*rW5pF=2KK;Z9!6Kbfi5X`1d`qejSEy<#AaSix#{6 zj`#b8AEiM1yH-FaZBc@X+*KsE+31+O_wvirq_J3F+O8Z>z(;Gj zW*&6%y98=Oc#9N=L$(Eb6D-*YBUl&+UlmN0l(D1b&f3&8rQ3zYQNDKHQv#0BY~ymJV7jttFUo3GZoWkMMA2d{YMr(6Z3NZXrE*H zRn-vVP)%^6L4^45Xn{5S&^;XP>PLjvPwH_bJ2l}Af~e*JIq}mslHnGBJNh_x-XYdj zi$6`dg}fEYu<)b)X2#nN80E_W5|{j}#Sl%+CA-lmot6N^rqj#zKiZ)yxd1qpt&7_x zC<3a7nnPLQt$?ntt5$!cIfmmxa;PqJ!x0L4nSK>`Sn9A*8=x1Z2NUA3PT&`%jg7we zhq`UQE#kFDUtUn6uENhz%dgBLQ5$~c-`O@K}&%D`1NtQ(*lB;k=f!{G!la#MXJ&O#C##Mhe zFht<43|F?t;@Ica=W|JoD>KltX!p7A!QDFkgc&;2j zA;J&m30$|iW8OL*40Jj<&QhXrMgRbKp+`P5l&%@86z7hp8g~&d#tB zSGt%t@$ZEZ(%tN@=V>JAEz$^o=f?!)%r;b!yV|4?)*XN=7b_eaa@vR#16H)(Gc=5< z^Z?vv!9Orx-A&|xyTsYji!Ib*#zUt!*O|^cbbmpkxA4LJ#I8SOp#I>8VI$u7=g2X8 zBV|E@!b`^*<8#X61bo4ZRBu*DnqHI_7VFb?0R90rvT~aM9g~`pDbIRpwaE;F9e4r$n#}l<9kyZ7EHQ@>iE?0u!;6WBP2>HHQ{Mpl~)Kf8tyDSEwpgG-{2ZZ z8z`^kQ!~rVf~Wnq{1%=@vVWkf{~^#V!0m2+;=6u`Rv#&PdVuFhWXnMl^FcPD;G2gn*4Ai)NgH)6Wmvqi1C=YtPHA zg*4Z^wSWTL!gVmPzUxLb3T7e8*uxHa0UXPUl8Zg_e&XUF*Mc>Z!7mP6VK0L`jojBl zY|G9jp#n74_LjcU5hwOmn}fIKbK0o6Pd5HZ-EcUbVOt8~Wkky17zede-2(6TFSqWw z3)g^D9xK(}Sb1G`lC44yb&g1-pVF#c6nx)FxFL1_7(4Z&e!`=E2YScIj(sQf0Tj$>A3C%{1mYjesIz$VQ~|RTvNlRDW*Rn=8yf~ z!mq{Ee{IdNnUcxwi5&UAq@CgRuA*b7&Ujdia4d`;xjQ7S)YYs#3H7kwa2K0hBP5d* z?2D1yuayXUdg#xM=luE!Nulcr!|E}LleqzHIQ!pS9!PSLde#oTC{2n4rhXi1PbmIf z6h7S!BkL%BR=HhdvGiJmP?R%BsJ`xcAPp$$DoO&W>R<+%q~3uL04XE=n02S&H|q|( zuDx~f1@z74a}R1c$i#<(I9lzmXIKv=Ns^AFm{uJx(*~p;S-qNuIuye1$hb+?2zs=^ zC@&NT&DnlE5-9Z>Qs$fCkgYLGGEIst_!SUBhN^UtmGn&F@+9tg{GX3B@V62Q&Gy<2 zbz^X6$?|RP@f8Erq0<}dOd0jSc!U1TP)6P8*Q!O4fAFAc>Np8O4O8o`QG-dOJA9N4 zel7x9aPraF)1~zQzep?q-|xr+s)7&>BMg3OB$+Uf8_^Mn0@`#rB}DC|7emc=mN(R6 zyg&zI-1MB)nz#y+y_|XdAy4_rI1WIRZ|co*Bt#*XFo9XIK6_hYEu3Y8M1HIiOl7e# zgADcK3L)a`wzsvS2~Hm6J9|{rT^bV1%s)B41LZPE2{uZpmQ0sCIL?0|$uusrLR;N& zpoRtR?s9z(XG>X_xL(tocAy+^?EVPRhdZAiHs!KcBnkM={zkrqQj44|QjmzNFL4xp zLnP%pM+;4b+yJl5&a*;q`)1&vK|Dq^>9sA>TN&4fH4sbismKG|+|ms~szi2D?ge-b^Y81B3b%;^zG>1dH3jQ+hGw5FtrDIL^cHtZaItWa*;!FCS-H z+Gs?$4jZvYfe?(c95jPZtQ0Pin+}F`U!97=?Y^Y3?)b}_ajQC8;rAaXHfBV4D)sVN zLPzO|zi)A2NRSTI-Bu|eJIRg&90_o<4er}RHjDyC+-Q(d(#oH1EpwLmvx+ZW^#cU; zh+%H>tMe`%g3I>|OrQIbH}4fvPJkvYoPwixIG2Ixn1t#m(@0;G?G5_O%Fiqb&3a{_ z?C+K9NUCii`#@^eqn0i@Ye7zNdqFX~A@%g{Twv!V=&0Y(*ZF0VD@y+h%*Q`kGU(tN zBC^C6drc_?EvN^in)3u4yg7`c7HyKuaXCKI)BO&dN9Auew2<9 zv4Worim+3rxlpkjO&T}bZcPNGIF`DLufu-bb};;4TB3EW@9^gVoZ!ok4Mf(9gZhFZ#o$)F+%5jT9{yP_Bsg z<2|Afa6A3FUpwn92}9KWRclBukBt!#*&rj+jahM>`XLA4y)L@kOur|G6|{PNdF;Sj zdi5tKL{e0ezw&9#Rp(=!EWUjUMMq;Bv{kjLFi$*Sg1#-Iqp?Kp?LCIwRCTMmIu%~) zfL3|nx7;SycsqadeflM(8wYoEiEibn5+nDJ{l^ni_w^~`^b^%bsDEl~sVdA*%wc-Z zGyIsuL#J2L+Z>K;;w!cDPrYJTGUhYkJ^IAcr-v1t0`3n9m|`UI31M-E`A$Eievq>! zJm^JkVC!3ECgvSG%Cu7RQx18W>k_Xv+NJ&!z7-|W^ZARII~)SJw&F~gm%6rz_zq8x zgyih_BZm)v?Aw03j6c&d_H4vpWmv)Unx3hR)YSx?+>?QmdpE^TcrYY9@V$9z&?o+| zkGVngRR*n8A^jh+c9li%EY=GQVzTSS_{Y&uMIOL)v#CeyMmwwBraQ8>{;JDAV$rQA zhrRj6Z7;R;z^Ql#&o$ZkRRyPcRloDBU7SOaou6>R71iR${ySfbmRjtW3b(-3Oca~O z8OPNnA6K{c5I^VXvGPJ-4(8t|yzl2V)QUrB6->JF?Uxoh*o(wXqb{m*X&%CHhU%rU z4|fZnNVj>W=NFi%q~_?;!gP>d7-OQP-!H<08ErVci`w>gzE8)4*|RLv_J=vP`ntHH zpTBtSXT|>Dy3u`|CFL6j+4{D2bq%VjwR78`+4ay?54H~r^YF+J`e?1O!UiXw6tRlx z_r5Qr!00-|hw=&k{+gS~f!j5?M7>@(6gXev8^FYdYY9dik4aq1lJ6Ui)!if&&aT^} zW|?FW->=m*`o1xXV5IT>%#{@~ZUftw)0~6-cbVbBFueib4?lZX}Cetg84DV5g%SL_$I^YzgW!lk^g-ql3mGvo|Vj#Gv|K{3H{ zcjWtzz?FD63me(++re95&jD z8Q-`|ur1=u59*IRUI2)$c zy|3VsdbDD&R%&jPBV}x4g9a5unLb4friqv#z{`VKnJn?+Fm=5Ng6RV%`?UO1sIc-Z zD++rfF~WpyT#0`eciB+@4uMzin#nz94V@aHh>-gIc03p_<}Jn47<7ys*097xg;)aN z@HO~!FG<0_YR>{}k z^;oa{P`1zBE${u-c-n#lYhkxtD)m<7 z=U%2+$TMeAJ=MEoht%|rnXaaN*H`ea=1Sgjuv$(%Qs}muJe|g4s8$;Da5wLXyVw1C&fk*g8TpWmHw}Xy zd%~K^@9|)8V_L&PT}m!&hR<;7#~zNWYPhwH?}J#yk3}{~AgG(iOi~R+*Kz2`G>FGS zIjMiI$jG#G%@#iDM->JF6bZDO^{aY%Jbl8_JgQ%yXU5)@YtoqdU4L56L2g>c&ThuG zUjv~9DMooEx+eMc2_g?BRYTwhHRmhTM5b9d7vnL_-O~! zOcGG=W)g?;d$lUW)ZOu179y^qH0ysOtpAsXwe`SeL$ z_3qj{GbH0+N(nWlf5@)!|nWSe{jDknRoF}B)UtvJPAGX&k5sxeU$PXRj?>I zMEDKWYnwE2=k2=uTVK9>dA8x>x$AkvBUaN_ZH9ijg-KPpQ$KylGIiMCiSphx0C}3% z-g|K$8YD1GsR@H}DEIAR12Vf95aJRI{VP;@;NVyP*>DLvOJ@n&vp@9)bA$~mEt3dF zdO3bfj7;u?9~-D}b)!5Y@Jk$Drk;jE@-+2;eQynBipe5gpQKM{|4VSi@q~s*!YUn= z3p92RJB(O@Fq9m39yhjwGe;?EvgCh)171DCI2MoB!DqIry<}suU&FGQ3SK{=kCkPp z{esXdDrH`xXpti1YI2rbh8N>kLa%lYy6j^V>68qE4kPN<+(^ z-Xn4Wx1m-Vl8^@K$UttXeL!PkIhIIb2?S!Ou`;%Lf6Ks7e22Hk*DLGhsJQwB)L)sQEFV5h zfaoFfy%F8I#>`!bryChl^{?EUcrfNUIy!-l4liJW+8z%NV^aointHMn&HCP*c;Ihw zzDLGwCr#1_-D+k2VS8(iHXZpOP+HcEGDtZd$yR4kDM?62{7opA#NW0R9Q!0sJ^w+n zKz_Fu#K}1@GbJ1nj_Ixt&nGJ?fSCoV{v}Rtfwk6WD@FmLO6%&xErHMuELWNZ(v) z!MjCKZ(TT&;o;G@HkL=#)Y@oc} zesH@%TpWRD3X3n1XX%Kk zPX0eV#9+R9ibs7W9-vP$LB4hgae=@j85o}Z--oA3Bs_2NW1%bWeXTZ{K-LckG(QNu zDx232nJzI`WO8d-Oc-YP0SUv7vYB!EQ?h!-pK zM%o53AJh%awz6v;GHzXO%SLmt?HVD{A_*${-T1Uv@Q&QGT)FWMwq29&lOm0Sv8O!o zTqah|8>lJjzaY_WoXC0n91uP0Q)*4eS&sOF?&j*zR~xm2W~1^bk4XV(psH5IwN=Kg z2ER;;x?1WrSnzt)z@PvE1 zRvk2YryEvwx$pYT21Y)ar1A7D2$g4s2rH|8vNw_49^|7P_`8qB1v{j| zze@~XFz=%=*pXZ=ds$nx$&vEmr#h6X^%noxgEzT%{rdIR*=O4qm4>flc2YDsiH*;> z!2ggj4?TMlxl%&cjyFfeSKz}n_C*{I_>{SYv$nId5 znEYJOWMfzv+6Pv}zaw;%twWjEe}M0IhO?#sc@^Fr`2PD4QxCQ>G2qNjC4;+bhvlny z1g=NKPwQrpuV?flW-v1is$`cT3i9-M=g#GSerM-dQZZ{wf(d!xcV4I}M+3-t8re?5 z=k@gWNNT7#lC?vry?P_b__Ee&RaaNW@$fko|Bm&NHr9osq|w=U;_>Z-;;=XMd4IqR z*bhB}s#@*bGg2nnl~<#QgcI0{IV+`U4)JV;ov`be-gDM-IKFGje8v8^wQuepFZY;Y z6uM$SF5cfK;u44bTS>?BQ(WpRp>*%QnvIO9(v+xe)Hf7sq1_pK%?Q@=#Yab`qG8tJ zA8Jv2sp@d7Q=63kcwQ>SsXkZ#l<=?RnU^-yxT5?J;ohm{Xo6mQVf2_~YXP=cv;Puhob(Zc@{jMm&y10UJOS!k9=LQBHF-OB z5Ne&#=fLTTB*MpZU-Q1skao3_lpxi8ss;gk!$$4$1*-(+n;EUBXhx;W0>xCxwMBz7 z+J9D_%KW*&LE_R~S&U2pPXt*EpPhE93&muSUUf!xTE^DS0mb<>s)?0w4@aCx9KmR7 zYknfkxTZ@7&1u93Xsr~u_Cq0-ReT#vc%&y1OX)@+UXBoyLM^q72k|GczAsz~|D!tx zxbT^kPo0Q7F8u>uh08Hr8h;3dz)U%c)h%m!2KjkpG33m{C&r1^4?i&P_;7g4EJ7D3S5E+)BhTZ$W=lU(xRK^S zWWjyMbg2|SLfwK7!mkpt-8JTrM&}<-1spt-vci@IP8q;tDV98C0<*tIVNaup#b59O zz2dsMr-b73H#`30)D{n%+VW<`?gPf+;l=)Os*v=cvH+xF5D7kiCVSrQmVy|f_FAKcsp$pwzJ38P844SQwuR4 z-#mtwG?}eEFf~D5Hy$06g>Uy%$k^7^mA4Wfszp&O)#00*EJj8`o|1frJi$gD%vxqf zc^cbvKWv=yb6A<8pa(wZg`TwXRz{H@LP4p;4)%izS?mkDiozV4YIuiK4M$NY(Y{kf zYgqRt`*=A?^q?{gqQ`?w=-#)%KS5~eDn`_jbihk^c@%%plq%zR&>P0C?axAFzj|9e2B z)1RILw^r z(A9|1*C;1E+DB7;;l-?^cqKhN>IT;8(%hGDob+P#*Te=erfp)zhuL57b9AVq%DItaEZoOzJH0oA^T=j(E2QRfdgMityJ`9!I2XHeH?>qeoobYOVSfnnF^@1Ise%c`zF; zkD%GYBj~!B4|io{SLo@+)HMAmLvrKTVLjPU?C4Q;@t4+pfHhu8q1fU4TOHitdY%?`Z_SWkwfP z(yLQ!vEaGtHeV;yqzh*!!!Kqasq_$#s)i40s4e9760>|YHLKbt1Ktzkp)^+vBY00T zFH z#b(m@+be>yxnNCP*U7-bM^F}MNA~9FvaP99)%>FXDh)m7k_eias~;&ChdL0o{JzIi zn(GwLp4=+El6R&NaiGy`P2lie=Wg7fxs6N_@(+SxpBPuT;V;#6zw>KM^-enEgW?7Z zc0$5rb7!$3!4d~xMg07Ce&DAC9~1Ajz3oS&$#?L#7xgCQtEl@#J}82`Go~uQ5Q=7z zTDh1jB)$I69k7JXde1TJ3t>#)26%<$Lr2cvwPa2@^w?f^vF}708tKd>N}UWoGK02$ za!nGfxEs1JIH~TCS+dL&Buk>qmQh(8_C=YjTydf79;Ti+Bo0t7=65^yx7m?n5Jfnk zeV&u5>Az%|9n_G~kD`WE_)87zyw5Lt-I4%ZopbyVBlwy3pB zwkp~-!q#}dd$j@e*65Iit>M}~6rv7p)4B((HC?w;`_D6(CtSgmJpQBUP!N(~)h5=5 z#dW4=$WuwZCCj$J#3|Ap{x%XP<2Ei^_U2~!`V?fb&HG=Y-XuRKZs?PL`w8U2ynU+8 z$YfBq;U8+k$LR?yf_bXP@f{;@BV?X->snXB zk=0ovk+3c8rtgu)1C#OJ)k>0rRClXdd-MG=YUe2+H%3WQF zbvjEZP2X<5I9hm{G_l*E8?$179(~PU`ROtB7vnsQSk0R;fF}55V#yZ>U`%daorVP8t*TH%My6n_s()8lRGOYHFOdQCgcLwO_q`m6d691!G22Lc#H<< zKZELe^Fp`lU?#An*H@TgiyJ^lgsAP)untiCWi%{bu-MjM8t1`qX{@%TR?=`Us|Vc6 zdc?Cb8eZ(*MwZA=^bl40- zRdbkx-DvMJyO9>pUncEgViqw`gu|a-ZJ}Nw8%ayVyw;OppdwhYsm=gfnXt%YN_zyC6IbN+cd zT9Z|`Ex{rJIg5BmZ&%Ik}PRjnWXmHn1CCVSR|m4X6G4#HBB zv!p7;0V{5h>`Y|9xHJ4P)n*+2d@6$#9*3+@mx70=;}i4?8tiFcVyfT4mJw%G8(*clyWn@z z9I@S8M~QLX`Lso|nkW91fsPB!vBq5>TIB!v6*_JXQKguZ*ZPfz>I@SpP8fxX{|>tt z^aV3A4Stw&-f%0DQvZxK>}k8ptJWe)v@z)0JLtr_Sg7-zVgRVGQ9wb_e(0 zIABi}@_Dq(t6rH*o)%sdsUqibt~jQAMR}Y?dk_;TUve3!lZtL6A2Klu=KqNZi(%}C zwWV5hsaJYR#;Pd33Pm7D!~0w&-q}mNDuQ6<4-|=MUWJ(R_@0Uj_hjjDPfm!XsE`E9 z@8k`_AN2;-CqDRBMmuS5j_X8G$II=Zyjz(ri{i}hbJ(ODa;J!alMYpN0+;qH`FJ$3 z2lE;{%oq`rDibj<4UljS0`xVyjtZ;c00D@HL;f3)up0@E%cu$W0L;*n7FMlw}Qdx z^Zwa?bM#n)XJ8EK{10Q04-<0@ZkqdKd7;RzRv3~}#g9=ybx}!fM)X%k)`KB-1zjrj z%xsi{ck&*`?2QKMlcrzirIn(FS}>QS$gw7xdW!! zUPeHe6JP^LdU6(W-f&QdrFV7>gFaR5J;vz`pNe%r?W`6GBo)U8r|Kpk6U~E#N$83p zv}sX4Vp8I_a}8;-B#9AfdkAh$1-8#4w_1i7taPrZyH?_a{`2#KrP3F*N=Us`EIC&_ z;01|wS6A2M+4lW<96t)_v*+WFAG^NXT1kzs(B6*}z_8C2{7RVVaXczqBV#1GOru~f ztd&>l$I%>z;k?Wo+i#z*(XadAH*Qe8#B|a}JuKfWq53RmZJ(&jX*l2?q zlV3KYoh4BNLoY1^=KZ3mN0&%$(Y>8YG$d3PlNP3c{~&{qY*kcshvY9ciCBJNf>^2Bxs%q7w98>a>RSt7< zljWBSjxvvpn*KUxGk)fm1Ax$V9P5^dmutZ2L;jme%;JcV#CHdy;i&G<<%3gap&7UJ zDh3ia2G7mmrqVzC3K<}7Kf({EAZql=#)Wmf6f|0Lh$>Q7WR^~T5wh9KKOR7Anq*`W z8(=z5y;KYD-Ojo*?AMdy|F4|Um>RJ-MjRqFvI`qfI zW*_}ERn;2hBW3^NR$Y&zUK$EG?UArBG}Z`zaoV~r^mNv|Wks&@^QxsUsbS0p#kibW zNiiohp#BIiosms=k-G>Z

(+|L)25_&<}z}&CdR*I|VOndo{!ku|!5r$eE6cL6FJg&;?mWH4x)2o}* z)q_*|SQ5b&PAS*rePJ8^SlWHAeY*Zr*ydUKl&tQMq1PO9H*7w?xjz@}?{jqSn@^73 zY`+F?`*+)$ia-?NJ_!c88H|hZlA1{hI~COLqJ}(@T1X>Js#(;v3=&cM@?Hwb0OSi0 zHTv^gZoE^tZCR;IQL9aRt4^-%w~v}tQZrX=e$7tmjV462{hFJ!5pA>m^2spb)@aEP zT=e5!z#iXvO$8@0_u~uurp|*JW~s$)EgK0c zPAGl`-)7qIcdn>(2yV+{iEg;H5@?%v=6RsaSO1;$ADt3mE_mf+#s`H(Gyymc;gm;-9pI~Ax7@5$x5JUlO88GmDWd#;t|Ml^ z;R*_EWbM1`a2@#bep^pchCP1wk`!twe2nx@J$JvUx;^)OC^=_H{O*uQid{wZhHnF< zUYF@va-XNj6veD#TAp}uGo%hH;{*7QD8<~SNE5PZWIC96q7}NqNmjyRA$tLg7?#lVd*pXQ zlQ41F=uG>sxe@RC@7Nu__6}}v>^;$%089P#aKU8Wu+{CKUpRc)1|rf6^u9G#IZcc- zPtX$!M%)C(u4hRNK?EUh-xvGi8TT|oWF!+PCux44xj=P@*J$X`3r7RwPCg*{^B+@B zchFp2aDzKi9hVCmvA1nJ*~Tn1v-M*2-1;KDxzWJaRkQDI|CF2b(8&EfGKH$ekgpuO znDwohsTqrinU+rjzkc={%@J_yQ+Ox!<=ZQ0jq4mzk_gf^RS!KOmZp7((hBS8?vnJG zKhIF1Bb-r%y1hl?t{guvP@1as4ccRWlzI}m+_9Pf)_bM9y12ybSdDu@ci(84z_9Mm z&s%M--}0uTnn*%o?f4L*wfyCc#C8Z!$}%SDu8re%)OUb1qZ)UHovEd0w^yt zfo1rq{b#qR&9LLJgOAiG`Yrj9>zaIX{jnTBJLp?yC);n21<#dyPH~!s&)nwN#jDrX zZtfVWfECn#{f3F)Y+Iy7B3>w>UUuYz%{AS&@8mB1c(K^YG{*q^s|(Jw7Y}!CBK*I$ z&c-k4Ymej2T5jvXyi3bvqq1&IGb5Wtq1DooTfae>KJ+y|6Bs5L*v~1rX$UV#Pfeg(b(l3k~on5iE ztE{1buDX?RLmR17fgQ38-xel3@ZLO7b~$qH@A~1}K|kH0s#$mYVFTH3DndY} zVa3^JTbU&fIU3-j=+6rFC1d!H)A@9D zU4|QK@>TA@67b9x(Wu-nRohuC6TpNCktnc{G(c-BgV#?CC+a5#e86VWS+yrI4EHKBkH;D+ME(fvEhQ72Ns)#P z3hKxu1W!ft>;VnKs4wBAp#0Z^hWY6ev}+ZSW_;*xP#$RFy#p;S#5Mb*l>sV2?P9xt zU|Yxcnil1AE@x(LX_D+7&Kz(1o+cUPay9_qWLog@{d!P4H}YMn>|7oN|Z$vBh@wE}v|kxs$9o z|6i~T8s;*AbmX>dcM?!fhE5$qoxZnywG0G3p!E};Dix<}r`s*Ba=fn{rsPC`OC(t~ zIg=7UB5owucRAsan zPY0}^En-u3Z7%xPhpXQ2{ylQK5gPc)w)R-Iv-5h7ZEq3A ztX@QtJLJ0cq<6Y!-=ba!@TM7xb^C9s?yE|qdTwth$0%r z4{!3-T%qm+Z_$@ND8KZ`d~9i=ha7EWifoOfCHiz^F!%0OpS+^1s|Cfp{pmwjg9r?_ zr0Qz~acs?JzUO#hpI+%??2y9FRbooE5Ur+`J=HtP=TQ)BjJb~uIC6R$tJ!_A}W95WK>>2gh7d^ag)ULxLdM#`HppfC|9KDCz zi4Az!B?_Gg`9fMTHCl&Y*CgB>;%g4}4E3>6ZK&|Btx%QwpM@t4)?!Buu3Gm;>_S=) z1n!1zc(-3LjlsD5q;}Y1Zx@e<)_dP+h+xdQ!-54hPaN;kP`7Ru zmycKHTow8{ET*ZhYJGl9>c;k|!7xfOuQ#zu9dsJ?!Jf33ET8+BJv$-fpn0>E-lnZH zP%Re|UU(E>TsSuY(p5MOuqKUhdwqis{NeX2*s=N}cbP?_DYq)y`j#+?+Z?mp<8kyv zWx@ft%CmRDnpP2{qvx-!c{6)lQKHeEAw+E{NHGlsLY>T%(m#gsV-sevUHn1u*r~>h z(%_!7l#x7y?_i-H%Eu_?P&8*r6wUb}s%8Y{-jugVg%Olk#EDg;F@t| zJ-ZgkFO_Q!zut{Zr&}{_{_zGncjM&CIr+qOUWSh&`gZ;Ro8CTc^Ap=HNCw>Z zJZi`K?>D`W&nV0|3Mshl!J%|R9fI?OcW3l43@dDnX6t@-^gbU2MnYIwGc{X5XUBVr zyp9xgvfpXTKqyf?K#9y(o`>y7+S__PEAwu9tzk#VK5FDsj7Zfpu{D_R+R%~pH5CT; z&JR|_>5FVdm735rwn|1@7cHjU@u@>*^*O(ykd7maFEqnO4|_mi4f5+<9X1?#m~?S2 zZ>4Dv!`4E=)qyB3VF*!HPk{jE>Ez;D)nm@IS9ccf_3yC9Mxd?)cTPlixc$;}MWwZM zk4{1JdUy_pxj5<&>svWvBm9s`03g;8EZA)rs(K*<|oSMkkwxR%L7(4@4>N{yq+u)UB zkWY~Bv6S^3_sbo09_li`i`Rm8-jNN?S_`u6RksXRM4gC7o+OAo?@dyG{tYwhUnnGE z*1u4S)daiSu{}6>XeMxKy7%4xdH>WWXPjo%%F`VZ%lE$7-U`SVaRPnvb%~#z*z%_r Va~_;4nFW4dqrcl({nZb@`~_dD47~sV literal 0 HcmV?d00001 diff --git a/dev-docs/bidders.md b/dev-docs/bidders.md index 4fc02d3ee4..a52a8bee0c 100644 --- a/dev-docs/bidders.md +++ b/dev-docs/bidders.md @@ -15,7 +15,7 @@ For each bidder listed below, you'll find the following information: {: .table .table-bordered .table-striped } | **Features** | A table of features supported by the adapter. | -| **"Send All Bids" Ad Server Keys** | Used for sending all bids to the ad server, as described in [Send All Bids to the Ad Server]({{site.baseurl}}/adops/send-all-bids-adops.html) | +| **"Send All Bids" Ad Server Keys** | Used for sending all bids to the ad server, as described in [Send All Bids vs Send Top Price]({{site.baseurl}}/adops/send-all-vs-top-price.html) | | **Bid Params** | Ad request parameters required by a given bidder, such as the tag ID, site ID, or query string parameters | You can also download the full CSV data file. diff --git a/dev-docs/pbs-bidders.md b/dev-docs/pbs-bidders.md index 5bf34c26ce..ca45b46a19 100644 --- a/dev-docs/pbs-bidders.md +++ b/dev-docs/pbs-bidders.md @@ -15,7 +15,7 @@ For each bidder listed below, you'll find the following information: {: .table .table-bordered .table-striped } | **Features** | A table of features supported by the adapter. | -| **"Send All Bids" Ad Server Keys** | Used for sending all bids to the ad server, as described in [Send All Bids to the Ad Server](/adops/send-all-bids-adops.html) | +| **"Send All Bids" Ad Server Keys** | Used for sending all bids to the ad server, as described in [Send All Bids vs Send Top Price](/adops/send-all-vs-top-price.html) | | **Bid Params** | Ad request parameters required by a given bidder, such as the tag ID, site ID, or query string parameters | You can also download the full CSV data file. diff --git a/overview/optimal-header-bidding-setup.md b/overview/optimal-header-bidding-setup.md index 64993e94f0..37732aaff1 100644 --- a/overview/optimal-header-bidding-setup.md +++ b/overview/optimal-header-bidding-setup.md @@ -1,6 +1,6 @@ --- layout: page_v2 -title: Optimal Header Bidding Setup +title: Analyze Header Bidding Setup description: What is the optimal header bidding setup and some common problems. pid: 10 @@ -13,7 +13,7 @@ sidebarType: 3 -# Optimal Header Bidding Setup +# Analyze Header Bidding Setup ### What's a good header bidding auction: @@ -141,9 +141,3 @@ Add the Plugin [Headerbid Expert](https://chrome.google.com/webstore/detail/head headerbid-expert-logo

v2FZyuNLU*$4HiU4^Hj48-?N?bpt11F(sM!fGpv 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 TT{(9n?F%>5_0&kJ_k#Wplo}-r literal 0 HcmV?d00001 diff --git a/assets/images/ad-ops/planning/pg-line-items-required.png b/assets/images/ad-ops/planning/pg-line-items-required.png new file mode 100644 index 0000000000000000000000000000000000000000..a94216005bb6f0e2c6e89838825f0f744c4c3b77 GIT binary patch literal 160738 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

- - - - - - From 49b02ade0480b465b03a9327cdcc24aad7117024 Mon Sep 17 00:00:00 2001 From: Oleksandr Soldatov Date: Mon, 28 Nov 2022 19:01:35 +0000 Subject: [PATCH 135/280] Add captifyRtdProvider Documentation Page (#4146) * Add Captify RTD documentation * reduce timeout in example --- dev-docs/modules/captifyRtdProvider.md | 75 ++++++++++++++++++++++++++ 1 file changed, 75 insertions(+) create mode 100644 dev-docs/modules/captifyRtdProvider.md diff --git a/dev-docs/modules/captifyRtdProvider.md b/dev-docs/modules/captifyRtdProvider.md new file mode 100644 index 0000000000..8249c453ba --- /dev/null +++ b/dev-docs/modules/captifyRtdProvider.md @@ -0,0 +1,75 @@ +--- +layout: page_v2 +title: Captify RTD Module +display_name: Captify RTD Module +description: Captify Real Time Data Module +page_type: module +module_type: rtd +module_code : captifyRtdProvider +enable_download : true +vendor_specific: true +sidebarType : 1 +--- + +# Captify RTD Module +{:.no_toc} + +* TOC +{:toc} + +## Description + +Captify uses publisher first-party on-site search data to power machine learning algorithms to create a suite of +contextual based targeting solutions that activate in a cookieless environment. + +The RTD submodule allows bid requests to be classified by our live-classification service, +maximising value for publishers by increasing scale for advertisers. + +Segments will be attached to bid request objects sent to different SSPs in order to optimize targeting. + +Contact prebid@captify.tech for more information. +## Integration + +1) Compile the Captify RTD Module along with your bid adapter and other modules into your Prebid build: + + +``` +gulp build --modules="rtdModule,captifyRtdProvider,appnexusBidAdapter,..." +``` + +2) Use `setConfig` to instruct Prebid.js to initialize the Captify RTD module, as specified below. + +## Configuration + +This module is configured as part of the `realTimeData.dataProviders` + +```javascript +var TIMEOUT = 100; // in milliseconds +pbjs.setConfig({ + realTimeData: { + auctionDelay: TIMEOUT, + dataProviders: [ + { + name: "CaptifyRTDModule", + waitForIt: true, + params: { + pubId: 123456, + bidders: ['appnexus'], + } + } + ] + } +}); +``` + +## Parameters + +{: .table .table-bordered .table-striped } +| Name |Type | Description |Mandatory | Notes | +| :--------------- | :------------ | :------------------------------------------------------------------ |:---------|:------------ | +| `name` | String | Real time data module name | yes | Always 'CaptifyRTDModule' | +| `waitForIt` | Boolean | Should be `true` if there's an `auctionDelay` defined (recommended) | no | Default `false` | +| `params` | Object | | | | +| `params.pubId` | Integer | Partner ID, required to get results and provided by Captify | yes | Use `123456` for tests, speak to your Captify account manager to receive your pubId | +| `params.bidders` | Array | List of bidders for which you would like data to be set | yes | Currently only 'appnexus' supported | +| `params.url` | String | Captify live-classification service url | no | Defaults to `https://live-classification.cpx.to/prebid-segments` From 4cb92386ffa415b7689441a925dbb40c6b03e974 Mon Sep 17 00:00:00 2001 From: bretg Date: Tue, 29 Nov 2022 14:49:37 -0500 Subject: [PATCH 136/280] PBS-Go supports stored responses (#4182) --- prebid-server/features/pbs-feature-idx.md | 4 ++-- troubleshooting/pbs-troubleshooting.md | 3 --- 2 files changed, 2 insertions(+), 5 deletions(-) diff --git a/prebid-server/features/pbs-feature-idx.md b/prebid-server/features/pbs-feature-idx.md index 380417a409..a82477f4da 100644 --- a/prebid-server/features/pbs-feature-idx.md +++ b/prebid-server/features/pbs-feature-idx.md @@ -41,8 +41,8 @@ title: Prebid Server | Features | [Stored Requests](/prebid-server/features/pbs-storedreqs.html) | Core | Accepts a stored request ID in the OpenRTB, looks it up against a local data store, and merges with the OpenRTB request record. | | | | Stored Requests | Unique Per Account | If an account ID is provided, PBS can distinguish between otherwise identical SRIDs. | | | | Stored Requests | Unique BidRequest IDs | Supports the generate-storedrequest-bidrequest-id setting telling Prebid Server to override the static bidrequest.id in the stored request with a UUID. | | | -| Stored Responses | Stored Auction Responses | Accepts a stored response ID in the OpenRTB, looks it up against a local data store, and merges with the OpenRTB response record. | | | -| Stored Responses | Stored Bid Responses | Accepts a stored response ID in the OpenRTB, looks it up against a local data store, and uses that as the bid adapter response. | | | +| [Stored Responses](/prebid-server/endpoints/openrtb2/pbs-endpoint-auction.html#stored-responses) | Stored Auction Responses | Accepts a stored response ID in the OpenRTB, looks it up against a local data store, and merges with the OpenRTB response record. | | | +| [Stored Responses](/prebid-server/endpoints/openrtb2/pbs-endpoint-auction.html#stored-responses) | Stored Bid Responses | Accepts a stored response ID in the OpenRTB, looks it up against a local data store, and uses that as the bid adapter response. | | | | First Party Data | Core | Accepts core [first party data](/prebid-server/endpoints/openrtb2/pbs-endpoint-auction.html#first-party-data-support) attributes and supports ext.prebid.data.bidders. | | | | First Party Data | Bidder-specific data | Accepts bidder-specific first party data attributes. | | | | First Party Data | AMP first party data | Accepts [first party data attributes on an AMP request](/prebid-server/endpoints/openrtb2/pbs-endpoint-amp.html#first-party-data). | | | diff --git a/troubleshooting/pbs-troubleshooting.md b/troubleshooting/pbs-troubleshooting.md index 7258657589..07801ba0cc 100644 --- a/troubleshooting/pbs-troubleshooting.md +++ b/troubleshooting/pbs-troubleshooting.md @@ -61,9 +61,6 @@ https://my-prebid-server.com/openrtb2/amp?tag_id=1111111111111&w=300&h=50&...&de ## Stored Responses -{: .pb-alert .pb-alert-important :} -Currently, this approach only works with the Java version of Prebid Server. - Sometimes it's hard to get a test bid. Other times, you may want to test a very specific bid, such as one that has a particular CPM value or creative. From 64e56a2d746bda5bd5701be755faa7a7022be7e2 Mon Sep 17 00:00:00 2001 From: bretg Date: Tue, 29 Nov 2022 14:56:02 -0500 Subject: [PATCH 137/280] Adapter code updates (#4183) * adapters with mixed case codes * kueez, cont --- dev-docs/bidders/acuityads.md | 3 ++- dev-docs/bidders/kueezrtb.md | 3 ++- 2 files changed, 4 insertions(+), 2 deletions(-) diff --git a/dev-docs/bidders/acuityads.md b/dev-docs/bidders/acuityads.md index b5acc3c418..5178321ec5 100644 --- a/dev-docs/bidders/acuityads.md +++ b/dev-docs/bidders/acuityads.md @@ -2,7 +2,7 @@ layout: bidder title: AcuityAds description: Prebid AcuityAds Bidder Adaptor -biddercode: acuityads +biddercode: acuityAds gdpr_supported: true usp_supported: true coppa_supported: true @@ -13,6 +13,7 @@ safeframes_ok: true deals_supported: true pbjs: true pbs: true +pbjs_version_notes: bidder code is acuityads (lower case) --- ### Note: diff --git a/dev-docs/bidders/kueezrtb.md b/dev-docs/bidders/kueezrtb.md index 0369b939e0..492f711ec4 100644 --- a/dev-docs/bidders/kueezrtb.md +++ b/dev-docs/bidders/kueezrtb.md @@ -2,7 +2,7 @@ layout: bidder title: KueezRTB description: Prebid KueezRTB Bidder Adaptor -biddercode: kueezrtb +biddercode: kueezRtb userIds: britepoolId, criteo, id5Id, identityLink, liveIntentId, netId, parrableId, pubCommonId, unifiedId gdpr_supported: true usp_supported: true @@ -19,6 +19,7 @@ ortb_blocking_supported: false multiformat_supported: will-bid-on-one gvl_id: 1165 pbjs: true +pbjs_version_notes: bidder code is kueezrtb (lower case) --- ### Bid Params From fb23f1a12f37e5ba36bb2891e4e509fd32f52e15 Mon Sep 17 00:00:00 2001 From: bretg Date: Wed, 30 Nov 2022 15:23:33 -0500 Subject: [PATCH 138/280] added filename option (#4185) --- guide.md | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/guide.md b/guide.md index d358c4d4cc..8baa2a74c7 100644 --- a/guide.md +++ b/guide.md @@ -265,7 +265,8 @@ The attributes in the Jekyll 'front matter' drive various behaviors and dynamic | pbs | sorta | true or false | defines whether this is a Prebid Server bidder | | description | no | - | Not used | | biddercode | yes | preferred bidder code | Used as the default ad server targeting suffix and the default download filename | -| aliasCode | no | download filename | Overrides the filename used to build the PBJS package on the download page | +| aliasCode | no | bid adapter that actually implements this adapter | Overrides the filename used to build the PBJS package on the download page. Will be suffixed with "BidAdapter". This is also intended to be a valid bidder code. | +| filename | no | bid adapter that actually implements this adapter | Used when a bid adapter is created with a filename that is not the bidder code. This completely overrides what is passed into the gulp build command, so needs to be fully specified. e.g. bidderaBidAdapter | | prevBiddercode | no | secondary bidder code | Adds a note about an alternate code that may have been used. | | pbjs_version_notes | no | string | Displays on the download page | | ANYTHING ELSE | no | string | There are many pieces of metadata (e.g. GDPR support, user IDs supported) that bid adapters can disclose. They're displayed on the bidder's parameter page. | @@ -280,6 +281,7 @@ with a prefix like `hb_cache_host`. So they wanted to have shorter bidderCode fo 2) change the biddercode to the shorter name as it's the new preferred code 3) add aliasCode so the Download page will pull in the right module 4) optionally add prevBiddercode to add a note to the page about the legacy value +5) optionally add filename if the bid adapter was created using a filename that's different than their bidder code. e.g. if the biddercode is "biddera" but they named the file "bidderABidAdapter", set the biddercode to "biddera" and the filename to "bidderABidAdapter". ## Algolia Search From 11a8139a6f7034f71d80d21bc807f3e40f3c4f2f Mon Sep 17 00:00:00 2001 From: bretg Date: Thu, 1 Dec 2022 07:12:44 -0500 Subject: [PATCH 139/280] added filename support on download page (#4186) --- dev-docs/bidders/acuityads.md | 4 ++-- dev-docs/bidders/kueezrtb.md | 4 ++-- download.md | 2 +- 3 files changed, 5 insertions(+), 5 deletions(-) diff --git a/dev-docs/bidders/acuityads.md b/dev-docs/bidders/acuityads.md index 5178321ec5..3a28f93ae8 100644 --- a/dev-docs/bidders/acuityads.md +++ b/dev-docs/bidders/acuityads.md @@ -2,7 +2,8 @@ layout: bidder title: AcuityAds description: Prebid AcuityAds Bidder Adaptor -biddercode: acuityAds +biddercode: acuityads +filename: acuityAdsBidAdapter gdpr_supported: true usp_supported: true coppa_supported: true @@ -13,7 +14,6 @@ safeframes_ok: true deals_supported: true pbjs: true pbs: true -pbjs_version_notes: bidder code is acuityads (lower case) --- ### Note: diff --git a/dev-docs/bidders/kueezrtb.md b/dev-docs/bidders/kueezrtb.md index 492f711ec4..f347ca22eb 100644 --- a/dev-docs/bidders/kueezrtb.md +++ b/dev-docs/bidders/kueezrtb.md @@ -2,7 +2,8 @@ layout: bidder title: KueezRTB description: Prebid KueezRTB Bidder Adaptor -biddercode: kueezRtb +biddercode: kueezrtb +filename: kueezRtbBidAdapter userIds: britepoolId, criteo, id5Id, identityLink, liveIntentId, netId, parrableId, pubCommonId, unifiedId gdpr_supported: true usp_supported: true @@ -19,7 +20,6 @@ ortb_blocking_supported: false multiformat_supported: will-bid-on-one gvl_id: 1165 pbjs: true -pbjs_version_notes: bidder code is kueezrtb (lower case) --- ### Bid Params diff --git a/download.md b/download.md index a738bcf1f9..339fe33d95 100644 --- a/download.md +++ b/download.md @@ -208,7 +208,7 @@ Prebid.js is open source software that is offered for free as a convenience. Whi
From 9ccc016e7919bf475b6fbf3c292d7a0d5feaa1b7 Mon Sep 17 00:00:00 2001 From: MartianTribe Date: Thu, 1 Dec 2022 11:59:27 -0500 Subject: [PATCH 140/280] Update kargo.md (#4189) --- dev-docs/bidders/kargo.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/dev-docs/bidders/kargo.md b/dev-docs/bidders/kargo.md index 870f0fb41d..21022ca102 100644 --- a/dev-docs/bidders/kargo.md +++ b/dev-docs/bidders/kargo.md @@ -33,4 +33,4 @@ Kargo is an invitation-only marketplace. Please reach out to your Kargo account {: .table .table-bordered .table-striped } | Name | Scope | Description | Example | Type | |---------------|----------|-------------|---------|----------| -| `tagid` | required | `openrtb2.BidRequest.Imp[0].TagID`|`'31355'`| `string` | +| `placementId` | required | `openrtb2.BidRequest.Imp[0].TagID`|`'31355'`| `string` | From 293efb3c351381261c97cfa639d4cd9921d9bf54 Mon Sep 17 00:00:00 2001 From: MartianTribe Date: Thu, 1 Dec 2022 12:48:52 -0500 Subject: [PATCH 141/280] Kargo adapter edit (#4190) * Update kargo.md * Update kargo.md * Update kargo.md * Update kargo.md --- dev-docs/bidders/kargo.md | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/dev-docs/bidders/kargo.md b/dev-docs/bidders/kargo.md index 21022ca102..872ccb0465 100644 --- a/dev-docs/bidders/kargo.md +++ b/dev-docs/bidders/kargo.md @@ -28,9 +28,10 @@ This adapter is known to use an HTTP 1 endpoint. Header bidding often generates ### Note: Kargo is an invitation-only marketplace. Please reach out to your Kargo account manager to get setup. Also, you *must* test on a mobile device, or emulate a mobile device by manipulating the user agent string sent to the server. -### Bid Params +### Bid Params: {: .table .table-bordered .table-striped } | Name | Scope | Description | Example | Type | |---------------|----------|-------------|---------|----------| -| `placementId` | required | `openrtb2.BidRequest.Imp[0].TagID`|`'31355'`| `string` | +| `placementId` | required | The placementId of the ad slot. |`'_jWuc8Hks'`| `string` | + From c4ddba519f577bf433d4effd2a68d9db7f00d839 Mon Sep 17 00:00:00 2001 From: jsnellbaker <31102355+jsnellbaker@users.noreply.github.com> Date: Wed, 7 Dec 2022 09:53:38 -0500 Subject: [PATCH 142/280] fix video module code for download page (#4200) --- dev-docs/modules/video.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/dev-docs/modules/video.md b/dev-docs/modules/video.md index c2e2044710..2333c102e6 100644 --- a/dev-docs/modules/video.md +++ b/dev-docs/modules/video.md @@ -4,7 +4,7 @@ title: Module - Video Module display_name: Prebid Video Module description: The Prebid Video Module allows Prebid to directly integrate with a Video Player. page_type: module -module_code : video +module_code : videoModule enable_download : true vendor_specific: false sidebarType : 1 From 9b2ed56d89e11954f5b96f1e917cc7a0fb301370 Mon Sep 17 00:00:00 2001 From: MartianTribe Date: Thu, 8 Dec 2022 09:04:29 -0500 Subject: [PATCH 143/280] Kargo adapter edit (#4205) * Update kargo.md * Update kargo.md * Update kargo.md * Update kargo.md * Update kargo.md Updated safeframes_ok setting to false --- dev-docs/bidders/kargo.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/dev-docs/bidders/kargo.md b/dev-docs/bidders/kargo.md index 872ccb0465..60b37746b7 100644 --- a/dev-docs/bidders/kargo.md +++ b/dev-docs/bidders/kargo.md @@ -12,7 +12,7 @@ usp_supported: true coppa_supported: false schain_supported: false dchain_supported: false -safeframes_ok: true +safeframes_ok: false deals_supported: true floors_supported: true fpd_supported: false From de0f7dd848febc6f4baba32f6ae60f8faf19c09d Mon Sep 17 00:00:00 2001 From: bretg Date: Thu, 8 Dec 2022 09:18:45 -0500 Subject: [PATCH 144/280] adding privacy regulation FAQ (#4139) * adding privacy regulation FAQ * first round of edits from feedback * wordsmithing, cont. * added GPP item * added GPP link --- dev-docs/faq.md | 25 +++++++++++++++++++++++++ 1 file changed, 25 insertions(+) diff --git a/dev-docs/faq.md b/dev-docs/faq.md index acab2d088c..28b2845274 100644 --- a/dev-docs/faq.md +++ b/dev-docs/faq.md @@ -23,6 +23,31 @@ Nope. The only approval process is a code review. There are separate instruction As for [membership](https://prebid.org/membership/) in Prebid.org, that's entirely optional -- we'd be happy to have you join and participate in the various committees, but it's not necessary for contributing code as a community member. +## How does Prebid support privacy regulations? + +Prebid understands that publishers are under increasing pressure to respond and adapt to privacy regulations. For instance, an increasing number of laws (including California’s CPRA and laws in Colorado, Virginia, Connecticut, and Utah) already require, or will require in 2023, specific disclosures around and ability to opt out of targeted advertising activities as well as “sales” of consumer data. While we cannot give legal advice, we do provide a toolkit that supports publishers in their efforts to comply with the laws that apply to them. If there’s a tool you need that you don’t see listed below, please do open an issue in the appropriate repository ([PBJS](https://github.com/prebid/Prebid.js/issues), [PBS](https://github.com/prebid/prebid-server/issues), [SDK](https://github.com/prebid/prebid-mobile-ios/issues)). + +To get started, first talk to your lawyers to determine your legal obligations. You might, for instance, want to run a Consent Management Platform (CMP) that allows consumers to opt into or out of certain practices when your users are in privacy-sensitive jurisdictions. + +After you’ve determined your legal obligations, consider the tools Prebid makes available to publishers so that their pages can determine what actions are needed based on their interpretation of the user’s actions and the company’s policies: + +- Turn off Prebid.js usersync: + - [for client-side adapters](/dev-docs/publisher-api-reference/setConfig.html#setConfig-Configure-User-Syncing) - either completely or for certain bidders. + - [for server-side adapters](/dev-docs/modules/prebidServer.html) - override the s2sConfig.syncEndpoint +- [Disable User ID modules](/dev-docs/modules/userId.html) - there are controls for different ID modules and which bidders can get which IDs. +- [Disable device access](/dev-docs/publisher-api-reference/setConfig.html#setConfig-deviceAccess) - no adapter or module will be able to create a cookie or HTML5 localstorage object. +- For GDPR: + - Consider the [GDPR](/dev-docs/modules/consentManagement.html) and [GDPR Enforcement](/dev-docs/modules/gdprEnforcement.html) modules, which flexibly support various actions like cancelling usersyncs, auctions, and analytics. Using these modules, bid adapters can receive the IAB TCF string from the CMP. + - Alternatively, the page can just avoid turning on certain bidders or modules. +- For CCPA / CPRA / US-Privacy: + - Consider the [US-Privacy](/dev-docs/modules/consentManagementUsp.html) module, which passes the IAB USP string through to bid adapters and supports data deletion events for User ID modules and other interested adapters and modules. +- Set the [COPPA flag](/dev-docs/publisher-api-reference/setConfig.html#setConfig-coppa), which passes this value through to modules and bid adapters. +- The IAB is still refining the definition of [GPP](https://iabtechlab.com/gpp/). Once that has settled, Prebid will build a GPP module. In the meantime, a few bid adapters have added support for statically setting GPP strings, e.g. pbjs.setConfig({ortb2: {regs: {gpp: "blah", gpp_sid: [1,2]}}}); +- Avoid adding certain bidders or modules to the AdUnit. +- Turn off header bidding altogether. + +Prebid relies on the IAB and community members to determine what tools are needed to support publishers in meeting their legal obligations. As noted above, if there’s another tool you need, please open an issue in the appropriate repository, or join the org and help us improve the system! + ## What should my timeouts be? Below is a set of recommended best practice starting points for your timeout settings: From f31365483102a70f26df60f6e0509907bb23a926 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Thu, 8 Dec 2022 09:30:52 -0700 Subject: [PATCH 145/280] Bump decode-uri-component from 0.2.0 to 0.2.2 (#4199) Bumps [decode-uri-component](https://github.com/SamVerschueren/decode-uri-component) from 0.2.0 to 0.2.2. - [Release notes](https://github.com/SamVerschueren/decode-uri-component/releases) - [Commits](https://github.com/SamVerschueren/decode-uri-component/compare/v0.2.0...v0.2.2) --- updated-dependencies: - dependency-name: decode-uri-component dependency-type: indirect ... Signed-off-by: dependabot[bot] Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- package-lock.json | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/package-lock.json b/package-lock.json index 5172e30aba..2a38e8471f 100644 --- a/package-lock.json +++ b/package-lock.json @@ -3993,9 +3993,9 @@ } }, "node_modules/decode-uri-component": { - "version": "0.2.0", - "resolved": "https://registry.npmjs.org/decode-uri-component/-/decode-uri-component-0.2.0.tgz", - "integrity": "sha1-6zkTMzRYd1y4TNGh+uBiEGu4dUU=", + "version": "0.2.2", + "resolved": "https://registry.npmjs.org/decode-uri-component/-/decode-uri-component-0.2.2.tgz", + "integrity": "sha512-FqUYQ+8o158GyGTrMFJms9qh3CqTKvAqgqsTnkLI8sKu0028orqBhxNMFkFen0zGyg6epACD32pjVk58ngIErQ==", "dev": true, "engines": { "node": ">=0.10" @@ -16034,9 +16034,9 @@ "dev": true }, "decode-uri-component": { - "version": "0.2.0", - "resolved": "https://registry.npmjs.org/decode-uri-component/-/decode-uri-component-0.2.0.tgz", - "integrity": "sha1-6zkTMzRYd1y4TNGh+uBiEGu4dUU=", + "version": "0.2.2", + "resolved": "https://registry.npmjs.org/decode-uri-component/-/decode-uri-component-0.2.2.tgz", + "integrity": "sha512-FqUYQ+8o158GyGTrMFJms9qh3CqTKvAqgqsTnkLI8sKu0028orqBhxNMFkFen0zGyg6epACD32pjVk58ngIErQ==", "dev": true }, "deep-equal": { From 65f133dfb3cb5063bd44b413da39fb5218a146b8 Mon Sep 17 00:00:00 2001 From: Olivier Date: Thu, 8 Dec 2022 17:31:59 +0100 Subject: [PATCH 146/280] Adagio: update userIds providers support (#4198) --- dev-docs/bidders/adagio.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/dev-docs/bidders/adagio.md b/dev-docs/bidders/adagio.md index da650672c3..284c64b3f9 100644 --- a/dev-docs/bidders/adagio.md +++ b/dev-docs/bidders/adagio.md @@ -5,7 +5,7 @@ description: Prebid Adagio Bidder Adaptor pbjs: true biddercode: adagio media_types: banner, native, video -userIds: britepoolId, criteo, id5Id, identityLink, liveIntentId, netId, parrableId, pubCommonId, pubProvidedId, sharedId, unifiedId +userIds: all floors_supported: true gdpr_supported: true usp_supported: true From ff419072572ffc4607bdc25a8c22fa6dec3b56ce Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Thu, 8 Dec 2022 09:34:35 -0700 Subject: [PATCH 147/280] Bump express from 4.17.1 to 4.18.2 (#4207) Bumps [express](https://github.com/expressjs/express) from 4.17.1 to 4.18.2. - [Release notes](https://github.com/expressjs/express/releases) - [Changelog](https://github.com/expressjs/express/blob/master/History.md) - [Commits](https://github.com/expressjs/express/compare/4.17.1...4.18.2) --- updated-dependencies: - dependency-name: express dependency-type: indirect ... Signed-off-by: dependabot[bot] Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- package-lock.json | 859 +++++++++++++++++++++++++++++++++------------- 1 file changed, 616 insertions(+), 243 deletions(-) diff --git a/package-lock.json b/package-lock.json index 2a38e8471f..3c9214ff12 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1361,13 +1361,13 @@ "dev": true }, "node_modules/accepts": { - "version": "1.3.7", - "resolved": "https://registry.npmjs.org/accepts/-/accepts-1.3.7.tgz", - "integrity": "sha512-Il80Qs2WjYlJIBNzNkK6KYqlVMTbZLXgHx2oT0pU/fjRHyEp+PEfEPY0R3WCwAGVOtauxh1hOxNgIf5bv7dQpA==", + "version": "1.3.8", + "resolved": "https://registry.npmjs.org/accepts/-/accepts-1.3.8.tgz", + "integrity": "sha512-PYAthTa2m2VKxuvSD3DPC/Gy+U+sOA1LAuT8mkmRuvw+NACSaeXEQ+NHcVF7rONl6qcaxV3Uuemwawk+7+SJLw==", "dev": true, "dependencies": { - "mime-types": "~2.1.24", - "negotiator": "0.6.2" + "mime-types": "~2.1.34", + "negotiator": "0.6.3" }, "engines": { "node": ">= 0.6" @@ -1964,30 +1964,33 @@ "dev": true }, "node_modules/body-parser": { - "version": "1.19.0", - "resolved": "https://registry.npmjs.org/body-parser/-/body-parser-1.19.0.tgz", - "integrity": "sha512-dhEPs72UPbDnAQJ9ZKMNTP6ptJaionhP5cBb541nXPlW60Jepo9RV/a4fX4XWW9CuFNK22krhrj1+rgzifNCsw==", + "version": "1.20.1", + "resolved": "https://registry.npmjs.org/body-parser/-/body-parser-1.20.1.tgz", + "integrity": "sha512-jWi7abTbYwajOytWCQc37VulmWiRae5RyTpaCyDcS5/lMdtwSz5lOpDE67srw/HYe35f1z3fDQw+3txg7gNtWw==", "dev": true, "dependencies": { - "bytes": "3.1.0", + "bytes": "3.1.2", "content-type": "~1.0.4", "debug": "2.6.9", - "depd": "~1.1.2", - "http-errors": "1.7.2", + "depd": "2.0.0", + "destroy": "1.2.0", + "http-errors": "2.0.0", "iconv-lite": "0.4.24", - "on-finished": "~2.3.0", - "qs": "6.7.0", - "raw-body": "2.4.0", - "type-is": "~1.6.17" + "on-finished": "2.4.1", + "qs": "6.11.0", + "raw-body": "2.5.1", + "type-is": "~1.6.18", + "unpipe": "1.0.0" }, "engines": { - "node": ">= 0.8" + "node": ">= 0.8", + "npm": "1.2.8000 || >= 1.4.16" } }, "node_modules/body-parser/node_modules/bytes": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.1.0.tgz", - "integrity": "sha512-zauLjrfCG+xvoyaqLoV8bLVXXNGC4JqlxFCutSDWA6fJrTo2ZuvLYTqZ7aHBLZSMOopbzwv8f+wZcVzfVTI2Dg==", + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.1.2.tgz", + "integrity": "sha512-/Nf7TyzTx6S3yRJObOAV7956r8cr2+Oj8AC5dt8wSP3BQAoeX58NoHyCU8P8zGkNXStjTSi6fzO6F0pBdcYbEg==", "dev": true, "engines": { "node": ">= 0.8" @@ -2002,12 +2005,43 @@ "ms": "2.0.0" } }, + "node_modules/body-parser/node_modules/depd": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/depd/-/depd-2.0.0.tgz", + "integrity": "sha512-g7nH6P6dyDioJogAAGprGpCtVImJhpPk/roCzdb3fIh61/s/nPsfR6onyMwkCAR/OlC3yBC0lESvUoQEAssIrw==", + "dev": true, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/body-parser/node_modules/destroy": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/destroy/-/destroy-1.2.0.tgz", + "integrity": "sha512-2sJGJTaXIIaR1w4iJSNoN0hnMY7Gpc/n8D4qSCJw8QqFWXf7cuAgnEHxBpweaVcPevC2l3KpjYCx3NypQQgaJg==", + "dev": true, + "engines": { + "node": ">= 0.8", + "npm": "1.2.8000 || >= 1.4.16" + } + }, "node_modules/body-parser/node_modules/ms": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", - "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=", + "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==", "dev": true }, + "node_modules/body-parser/node_modules/on-finished": { + "version": "2.4.1", + "resolved": "https://registry.npmjs.org/on-finished/-/on-finished-2.4.1.tgz", + "integrity": "sha512-oVlzkg3ENAhCk2zdv7IJwd/QUD4z2RxRwpkcGY8psCVcCYZNq4wYnVWALHM+brtuJjePWiYF/ClmuDr8Ch5+kg==", + "dev": true, + "dependencies": { + "ee-first": "1.1.1" + }, + "engines": { + "node": ">= 0.8" + } + }, "node_modules/bonjour": { "version": "3.5.0", "resolved": "https://registry.npmjs.org/bonjour/-/bonjour-3.5.0.tgz", @@ -2853,6 +2887,19 @@ "node": ">=0.10.0" } }, + "node_modules/call-bind": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/call-bind/-/call-bind-1.0.2.tgz", + "integrity": "sha512-7O+FbCihrB5WGbFYesctwmTKae6rOiIzmz1icreWJ+0aA7LJfuqhEso2T9ncpcFtzMQtzXf2QGGueWJGTYsqrA==", + "dev": true, + "dependencies": { + "function-bind": "^1.1.1", + "get-intrinsic": "^1.0.2" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, "node_modules/call-me-maybe": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/call-me-maybe/-/call-me-maybe-1.0.1.tgz", @@ -3387,17 +3434,37 @@ "dev": true }, "node_modules/content-disposition": { - "version": "0.5.3", - "resolved": "https://registry.npmjs.org/content-disposition/-/content-disposition-0.5.3.tgz", - "integrity": "sha512-ExO0774ikEObIAEV9kDo50o+79VCUdEB6n6lzKgGwupcVeRlhrj3qGAfwq8G6uBJjkqLrhT0qEYFcWng8z1z0g==", + "version": "0.5.4", + "resolved": "https://registry.npmjs.org/content-disposition/-/content-disposition-0.5.4.tgz", + "integrity": "sha512-FveZTNuGw04cxlAiWbzi6zTAL/lhehaWbTtgluJh4/E95DqMwTmha3KZN1aAWA8cFIhHzMZUvLevkw5Rqk+tSQ==", "dev": true, "dependencies": { - "safe-buffer": "5.1.2" + "safe-buffer": "5.2.1" }, "engines": { "node": ">= 0.6" } }, + "node_modules/content-disposition/node_modules/safe-buffer": { + "version": "5.2.1", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz", + "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ] + }, "node_modules/content-type": { "version": "1.0.4", "resolved": "https://registry.npmjs.org/content-type/-/content-type-1.0.4.tgz", @@ -3417,9 +3484,9 @@ } }, "node_modules/cookie": { - "version": "0.4.0", - "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.4.0.tgz", - "integrity": "sha512-+Hp8fLp57wnUSt0tY0tHEXh4voZRDnoIrZPqlo3DPiI4y9lwg/jqx+1Om94/W6ZaPDOUbnjOt/99w66zk+l1Xg==", + "version": "0.5.0", + "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.5.0.tgz", + "integrity": "sha512-YZ3GUyn/o8gfKJlnlX7g7xq4gyO6OSuhGPKaaGssGB2qgDUS0gPgtTvoyZLTt9Ab6dC4hfc9dV5arkvc/OCmrw==", "dev": true, "engines": { "node": ">= 0.6" @@ -4869,38 +4936,39 @@ } }, "node_modules/express": { - "version": "4.17.1", - "resolved": "https://registry.npmjs.org/express/-/express-4.17.1.tgz", - "integrity": "sha512-mHJ9O79RqluphRrcw2X/GTh3k9tVv8YcoyY4Kkh4WDMUYKRZUq0h1o0w2rrrxBqM7VoeUVqgb27xlEMXTnYt4g==", + "version": "4.18.2", + "resolved": "https://registry.npmjs.org/express/-/express-4.18.2.tgz", + "integrity": "sha512-5/PsL6iGPdfQ/lKM1UuielYgv3BUoJfz1aUwU9vHZ+J7gyvwdQXFEBIEIaxeGf0GIcreATNyBExtalisDbuMqQ==", "dev": true, "dependencies": { - "accepts": "~1.3.7", + "accepts": "~1.3.8", "array-flatten": "1.1.1", - "body-parser": "1.19.0", - "content-disposition": "0.5.3", + "body-parser": "1.20.1", + "content-disposition": "0.5.4", "content-type": "~1.0.4", - "cookie": "0.4.0", + "cookie": "0.5.0", "cookie-signature": "1.0.6", "debug": "2.6.9", - "depd": "~1.1.2", + "depd": "2.0.0", "encodeurl": "~1.0.2", "escape-html": "~1.0.3", "etag": "~1.8.1", - "finalhandler": "~1.1.2", + "finalhandler": "1.2.0", "fresh": "0.5.2", + "http-errors": "2.0.0", "merge-descriptors": "1.0.1", "methods": "~1.1.2", - "on-finished": "~2.3.0", + "on-finished": "2.4.1", "parseurl": "~1.3.3", "path-to-regexp": "0.1.7", - "proxy-addr": "~2.0.5", - "qs": "6.7.0", + "proxy-addr": "~2.0.7", + "qs": "6.11.0", "range-parser": "~1.2.1", - "safe-buffer": "5.1.2", - "send": "0.17.1", - "serve-static": "1.14.1", - "setprototypeof": "1.1.1", - "statuses": "~1.5.0", + "safe-buffer": "5.2.1", + "send": "0.18.0", + "serve-static": "1.15.0", + "setprototypeof": "1.2.0", + "statuses": "2.0.1", "type-is": "~1.6.18", "utils-merge": "1.0.1", "vary": "~1.1.2" @@ -4924,12 +4992,62 @@ "ms": "2.0.0" } }, + "node_modules/express/node_modules/depd": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/depd/-/depd-2.0.0.tgz", + "integrity": "sha512-g7nH6P6dyDioJogAAGprGpCtVImJhpPk/roCzdb3fIh61/s/nPsfR6onyMwkCAR/OlC3yBC0lESvUoQEAssIrw==", + "dev": true, + "engines": { + "node": ">= 0.8" + } + }, "node_modules/express/node_modules/ms": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=", "dev": true }, + "node_modules/express/node_modules/on-finished": { + "version": "2.4.1", + "resolved": "https://registry.npmjs.org/on-finished/-/on-finished-2.4.1.tgz", + "integrity": "sha512-oVlzkg3ENAhCk2zdv7IJwd/QUD4z2RxRwpkcGY8psCVcCYZNq4wYnVWALHM+brtuJjePWiYF/ClmuDr8Ch5+kg==", + "dev": true, + "dependencies": { + "ee-first": "1.1.1" + }, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/express/node_modules/safe-buffer": { + "version": "5.2.1", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz", + "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ] + }, + "node_modules/express/node_modules/statuses": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/statuses/-/statuses-2.0.1.tgz", + "integrity": "sha512-RwNA9Z/7PrK06rYLIzFMlaF+l73iwpzsqRIFgbMLbTcLD6cOao82TaWefPXQvB2fOC4AjuYSEndS7N/mTCbkdQ==", + "dev": true, + "engines": { + "node": ">= 0.8" + } + }, "node_modules/extend-shallow": { "version": "3.0.2", "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-3.0.2.tgz", @@ -5194,17 +5312,17 @@ } }, "node_modules/finalhandler": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/finalhandler/-/finalhandler-1.1.2.tgz", - "integrity": "sha512-aAWcW57uxVNrQZqFXjITpW3sIUQmHGG3qSb9mUah9MgMC4NeWhNOlNjXEYq3HjRAvL6arUviZGGJsBg6z0zsWA==", + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/finalhandler/-/finalhandler-1.2.0.tgz", + "integrity": "sha512-5uXcUVftlQMFnWC9qu/svkWv3GTd2PfUhK/3PLkYNAe7FbqJMt3515HaxE6eRL74GdsriiwujiawdaB1BpEISg==", "dev": true, "dependencies": { "debug": "2.6.9", "encodeurl": "~1.0.2", "escape-html": "~1.0.3", - "on-finished": "~2.3.0", + "on-finished": "2.4.1", "parseurl": "~1.3.3", - "statuses": "~1.5.0", + "statuses": "2.0.1", "unpipe": "~1.0.0" }, "engines": { @@ -5223,9 +5341,30 @@ "node_modules/finalhandler/node_modules/ms": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", - "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=", + "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==", "dev": true }, + "node_modules/finalhandler/node_modules/on-finished": { + "version": "2.4.1", + "resolved": "https://registry.npmjs.org/on-finished/-/on-finished-2.4.1.tgz", + "integrity": "sha512-oVlzkg3ENAhCk2zdv7IJwd/QUD4z2RxRwpkcGY8psCVcCYZNq4wYnVWALHM+brtuJjePWiYF/ClmuDr8Ch5+kg==", + "dev": true, + "dependencies": { + "ee-first": "1.1.1" + }, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/finalhandler/node_modules/statuses": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/statuses/-/statuses-2.0.1.tgz", + "integrity": "sha512-RwNA9Z/7PrK06rYLIzFMlaF+l73iwpzsqRIFgbMLbTcLD6cOao82TaWefPXQvB2fOC4AjuYSEndS7N/mTCbkdQ==", + "dev": true, + "engines": { + "node": ">= 0.8" + } + }, "node_modules/find-cache-dir": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/find-cache-dir/-/find-cache-dir-2.1.0.tgz", @@ -5307,9 +5446,9 @@ } }, "node_modules/forwarded": { - "version": "0.1.2", - "resolved": "https://registry.npmjs.org/forwarded/-/forwarded-0.1.2.tgz", - "integrity": "sha1-mMI9qxF1ZXuMBXPozszZGw/xjIQ=", + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/forwarded/-/forwarded-0.2.0.tgz", + "integrity": "sha512-buRG0fpBtRHSTCOASe6hD258tEubFoRLb4ZNA6NxMVHNw2gOcwHo9wyablzMzOA5z9xA9L1KNjk/Nt6MT9aYow==", "dev": true, "engines": { "node": ">= 0.6" @@ -5477,6 +5616,20 @@ "node": "6.* || 8.* || >= 10.*" } }, + "node_modules/get-intrinsic": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.1.3.tgz", + "integrity": "sha512-QJVz1Tj7MS099PevUG5jvnt9tSkXN8K14dxQlikJuPt4uD9hHAHjLyLBiLR5zELelBdD9QNRAXZzsJx0WaDL9A==", + "dev": true, + "dependencies": { + "function-bind": "^1.1.1", + "has": "^1.0.3", + "has-symbols": "^1.0.3" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, "node_modules/get-stream": { "version": "4.1.0", "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-4.1.0.tgz", @@ -5673,12 +5826,15 @@ } }, "node_modules/has-symbols": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.0.1.tgz", - "integrity": "sha512-PLcsoqu++dmEIZB+6totNFKq/7Do+Z0u4oT0zKOJNl3lYK6vGwwu2hjHs+68OEZbTjiUE9bgOABXbP/GvrS0Kg==", + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.0.3.tgz", + "integrity": "sha512-l3LCuF6MgDNwTDKkdYGEihYjt5pRPbEg46rtlmnSPlUbgmB8LOIrKJbYYFBSbnPaJexMKtiPO8hmeRjRz2Td+A==", "dev": true, "engines": { "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" } }, "node_modules/has-value": { @@ -5885,26 +6041,38 @@ "dev": true }, "node_modules/http-errors": { - "version": "1.7.2", - "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-1.7.2.tgz", - "integrity": "sha512-uUQBt3H/cSIVfch6i1EuPNy/YsRSOUBXTVfZ+yR7Zjez3qjBz6i9+i4zjNaoqcoFVI4lQJ5plg63TvGfRSDCRg==", + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-2.0.0.tgz", + "integrity": "sha512-FtwrG/euBzaEjYeRqOgly7G0qviiXoJWnvEH2Z1plBdXgbyjv34pHTSb9zoeHMyDy33+DWy5Wt9Wo+TURtOYSQ==", "dev": true, "dependencies": { - "depd": "~1.1.2", - "inherits": "2.0.3", - "setprototypeof": "1.1.1", - "statuses": ">= 1.5.0 < 2", - "toidentifier": "1.0.0" + "depd": "2.0.0", + "inherits": "2.0.4", + "setprototypeof": "1.2.0", + "statuses": "2.0.1", + "toidentifier": "1.0.1" }, "engines": { - "node": ">= 0.6" + "node": ">= 0.8" } }, - "node_modules/http-errors/node_modules/inherits": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.3.tgz", - "integrity": "sha1-Yzwsg+PaQqUC9SRmAiSA9CCCYd4=", - "dev": true + "node_modules/http-errors/node_modules/depd": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/depd/-/depd-2.0.0.tgz", + "integrity": "sha512-g7nH6P6dyDioJogAAGprGpCtVImJhpPk/roCzdb3fIh61/s/nPsfR6onyMwkCAR/OlC3yBC0lESvUoQEAssIrw==", + "dev": true, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/http-errors/node_modules/statuses": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/statuses/-/statuses-2.0.1.tgz", + "integrity": "sha512-RwNA9Z/7PrK06rYLIzFMlaF+l73iwpzsqRIFgbMLbTcLD6cOao82TaWefPXQvB2fOC4AjuYSEndS7N/mTCbkdQ==", + "dev": true, + "engines": { + "node": ">= 0.8" + } }, "node_modules/http-parser-js": { "version": "0.5.8", @@ -7135,7 +7303,7 @@ "node_modules/media-typer": { "version": "0.3.0", "resolved": "https://registry.npmjs.org/media-typer/-/media-typer-0.3.0.tgz", - "integrity": "sha1-hxDXrwqmJvj/+hzgAWhUUmMlV0g=", + "integrity": "sha512-dq+qelQ9akHpcOl/gUVRTxVIOkAJ1wR3QAvb4RsVjS8oVoFjDGTc679wJYmUmknUF5HwMLOgb5O+a3KxfWapPQ==", "dev": true, "engines": { "node": ">= 0.6" @@ -7255,21 +7423,21 @@ } }, "node_modules/mime-db": { - "version": "1.44.0", - "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.44.0.tgz", - "integrity": "sha512-/NOTfLrsPBVeH7YtFPgsVWveuL+4SjjYxaQ1xtM1KMFj7HdxlBlxeyNLzhyJVx7r4rZGJAZ/6lkKCitSc/Nmpg==", + "version": "1.52.0", + "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.52.0.tgz", + "integrity": "sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==", "dev": true, "engines": { "node": ">= 0.6" } }, "node_modules/mime-types": { - "version": "2.1.27", - "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.27.tgz", - "integrity": "sha512-JIhqnCasI9yD+SsmkquHBxTSEuZdQX5BuQnS2Vc7puQQQ+8yiP5AY5uWhpdv4YL4VM5c6iliiYWPgJ/nJQLp7w==", + "version": "2.1.35", + "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.35.tgz", + "integrity": "sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==", "dev": true, "dependencies": { - "mime-db": "1.44.0" + "mime-db": "1.52.0" }, "engines": { "node": ">= 0.6" @@ -7486,9 +7654,9 @@ } }, "node_modules/negotiator": { - "version": "0.6.2", - "resolved": "https://registry.npmjs.org/negotiator/-/negotiator-0.6.2.tgz", - "integrity": "sha512-hZXc7K2e+PgeI1eDBe/10Ard4ekbfrrqG8Ep+8Jmf4JID2bNg7NvCPOZN+kfF574pFQI7mum2AUqDidoKqcTOw==", + "version": "0.6.3", + "resolved": "https://registry.npmjs.org/negotiator/-/negotiator-0.6.3.tgz", + "integrity": "sha512-+EUsqGPLsM+j/zdChZjsnX51g4XrHFOIXwfnCVPGlQk/k5giakcKsuxCObBRu6DSm9opw/O6slWbJdghQM4bBg==", "dev": true, "engines": { "node": ">= 0.6" @@ -7682,10 +7850,13 @@ } }, "node_modules/object-inspect": { - "version": "1.8.0", - "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.8.0.tgz", - "integrity": "sha512-jLdtEOB112fORuypAyl/50VRVIBIdVQOSUUGQHzJ4xBSbit81zRarz7GThkEFZy1RceYrWYcPcBFPQwHyAc1gA==", - "dev": true + "version": "1.12.2", + "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.12.2.tgz", + "integrity": "sha512-z+cPxW0QGUp0mcqcsgQyLVRDoXFQbXOwBaqyF7VIgI4TWNQsDHrBpUQslRmIfAoYWdYzs6UlKJtB2XJpTaNSpQ==", + "dev": true, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } }, "node_modules/object-is": { "version": "1.1.3", @@ -9039,12 +9210,12 @@ "dev": true }, "node_modules/proxy-addr": { - "version": "2.0.6", - "resolved": "https://registry.npmjs.org/proxy-addr/-/proxy-addr-2.0.6.tgz", - "integrity": "sha512-dh/frvCBVmSsDYzw6n926jv974gddhkFPfiN8hPOi30Wax25QZyZEGveluCgliBnqmuM+UJmBErbAUFIoDbjOw==", + "version": "2.0.7", + "resolved": "https://registry.npmjs.org/proxy-addr/-/proxy-addr-2.0.7.tgz", + "integrity": "sha512-llQsMLSUDUPT44jdrU/O37qlnifitDP+ZwrmmZcoSKyLKvtZxpyV0n2/bD/N4tBAAZ/gJEdZU7KMraoK1+XYAg==", "dev": true, "dependencies": { - "forwarded": "~0.1.2", + "forwarded": "0.2.0", "ipaddr.js": "1.9.1" }, "engines": { @@ -9134,12 +9305,18 @@ } }, "node_modules/qs": { - "version": "6.7.0", - "resolved": "https://registry.npmjs.org/qs/-/qs-6.7.0.tgz", - "integrity": "sha512-VCdBRNFTX1fyE7Nb6FYoURo/SPe62QCaAyzJvUjwRaIsc+NePBEniHlvxFmmX56+HZphIGtV0XeCirBtpDrTyQ==", + "version": "6.11.0", + "resolved": "https://registry.npmjs.org/qs/-/qs-6.11.0.tgz", + "integrity": "sha512-MvjoMCJwEarSbUYk5O+nmoSzSutSsTwF85zcHPQ9OrlFoZOYIjaqBAJIqIXjptyD5vThxGq52Xu/MaJzRkIk4Q==", "dev": true, + "dependencies": { + "side-channel": "^1.0.4" + }, "engines": { "node": ">=0.6" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" } }, "node_modules/querystring": { @@ -9195,13 +9372,13 @@ } }, "node_modules/raw-body": { - "version": "2.4.0", - "resolved": "https://registry.npmjs.org/raw-body/-/raw-body-2.4.0.tgz", - "integrity": "sha512-4Oz8DUIwdvoa5qMJelxipzi/iJIi40O5cGV1wNYp5hvZP8ZN0T+jiNkL0QepXs+EsQ9XJ8ipEDoiH70ySUJP3Q==", + "version": "2.5.1", + "resolved": "https://registry.npmjs.org/raw-body/-/raw-body-2.5.1.tgz", + "integrity": "sha512-qqJBtEyVgS0ZmPGdCFPWJ3FreoqvG4MVQln/kCgF7Olq95IbOp0/BWyMwbdtn4VTvkM8Y7khCQ2Xgk/tcrCXig==", "dev": true, "dependencies": { - "bytes": "3.1.0", - "http-errors": "1.7.2", + "bytes": "3.1.2", + "http-errors": "2.0.0", "iconv-lite": "0.4.24", "unpipe": "1.0.0" }, @@ -9210,9 +9387,9 @@ } }, "node_modules/raw-body/node_modules/bytes": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.1.0.tgz", - "integrity": "sha512-zauLjrfCG+xvoyaqLoV8bLVXXNGC4JqlxFCutSDWA6fJrTo2ZuvLYTqZ7aHBLZSMOopbzwv8f+wZcVzfVTI2Dg==", + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.1.2.tgz", + "integrity": "sha512-/Nf7TyzTx6S3yRJObOAV7956r8cr2+Oj8AC5dt8wSP3BQAoeX58NoHyCU8P8zGkNXStjTSi6fzO6F0pBdcYbEg==", "dev": true, "engines": { "node": ">= 0.8" @@ -9796,24 +9973,24 @@ } }, "node_modules/send": { - "version": "0.17.1", - "resolved": "https://registry.npmjs.org/send/-/send-0.17.1.tgz", - "integrity": "sha512-BsVKsiGcQMFwT8UxypobUKyv7irCNRHk1T0G680vk88yf6LBByGcZJOTJCrTP2xVN6yI+XjPJcNuE3V4fT9sAg==", + "version": "0.18.0", + "resolved": "https://registry.npmjs.org/send/-/send-0.18.0.tgz", + "integrity": "sha512-qqWzuOjSFOuqPjFe4NOsMLafToQQwBSOEpS+FwEt3A2V3vKubTquT3vmLTQpFgMXp8AlFWFuP1qKaJZOtPpVXg==", "dev": true, "dependencies": { "debug": "2.6.9", - "depd": "~1.1.2", - "destroy": "~1.0.4", + "depd": "2.0.0", + "destroy": "1.2.0", "encodeurl": "~1.0.2", "escape-html": "~1.0.3", "etag": "~1.8.1", "fresh": "0.5.2", - "http-errors": "~1.7.2", + "http-errors": "2.0.0", "mime": "1.6.0", - "ms": "2.1.1", - "on-finished": "~2.3.0", + "ms": "2.1.3", + "on-finished": "2.4.1", "range-parser": "~1.2.1", - "statuses": "~1.5.0" + "statuses": "2.0.1" }, "engines": { "node": ">= 0.8.0" @@ -9831,15 +10008,55 @@ "node_modules/send/node_modules/debug/node_modules/ms": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", - "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=", + "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==", "dev": true }, + "node_modules/send/node_modules/depd": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/depd/-/depd-2.0.0.tgz", + "integrity": "sha512-g7nH6P6dyDioJogAAGprGpCtVImJhpPk/roCzdb3fIh61/s/nPsfR6onyMwkCAR/OlC3yBC0lESvUoQEAssIrw==", + "dev": true, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/send/node_modules/destroy": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/destroy/-/destroy-1.2.0.tgz", + "integrity": "sha512-2sJGJTaXIIaR1w4iJSNoN0hnMY7Gpc/n8D4qSCJw8QqFWXf7cuAgnEHxBpweaVcPevC2l3KpjYCx3NypQQgaJg==", + "dev": true, + "engines": { + "node": ">= 0.8", + "npm": "1.2.8000 || >= 1.4.16" + } + }, "node_modules/send/node_modules/ms": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.1.tgz", - "integrity": "sha512-tgp+dl5cGk28utYktBsrFqA7HKgrhgPsg6Z/EfhWI4gl1Hwq8B/GmY/0oXZ6nF8hDVesS/FpnYaD/kOWhYQvyg==", + "version": "2.1.3", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", + "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==", "dev": true }, + "node_modules/send/node_modules/on-finished": { + "version": "2.4.1", + "resolved": "https://registry.npmjs.org/on-finished/-/on-finished-2.4.1.tgz", + "integrity": "sha512-oVlzkg3ENAhCk2zdv7IJwd/QUD4z2RxRwpkcGY8psCVcCYZNq4wYnVWALHM+brtuJjePWiYF/ClmuDr8Ch5+kg==", + "dev": true, + "dependencies": { + "ee-first": "1.1.1" + }, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/send/node_modules/statuses": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/statuses/-/statuses-2.0.1.tgz", + "integrity": "sha512-RwNA9Z/7PrK06rYLIzFMlaF+l73iwpzsqRIFgbMLbTcLD6cOao82TaWefPXQvB2fOC4AjuYSEndS7N/mTCbkdQ==", + "dev": true, + "engines": { + "node": ">= 0.8" + } + }, "node_modules/serialize-javascript": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/serialize-javascript/-/serialize-javascript-4.0.0.tgz", @@ -9910,15 +10127,15 @@ "dev": true }, "node_modules/serve-static": { - "version": "1.14.1", - "resolved": "https://registry.npmjs.org/serve-static/-/serve-static-1.14.1.tgz", - "integrity": "sha512-JMrvUwE54emCYWlTI+hGrGv5I8dEwmco/00EvkzIIsR7MqrHonbD9pO2MOfFnpFntl7ecpZs+3mW+XbQZu9QCg==", + "version": "1.15.0", + "resolved": "https://registry.npmjs.org/serve-static/-/serve-static-1.15.0.tgz", + "integrity": "sha512-XGuRDNjXUijsUL0vl6nSD7cwURuzEgglbOaFuZM9g3kwDXOWVTck0jLzjPzGD+TazWbboZYu52/9/XPdUgne9g==", "dev": true, "dependencies": { "encodeurl": "~1.0.2", "escape-html": "~1.0.3", "parseurl": "~1.3.3", - "send": "0.17.1" + "send": "0.18.0" }, "engines": { "node": ">= 0.8.0" @@ -9979,9 +10196,9 @@ "dev": true }, "node_modules/setprototypeof": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.1.1.tgz", - "integrity": "sha512-JvdAWfbXeIGaZ9cILp38HntZSFSo3mWg6xGcJJsd+d4aRMOqauag1C63dJfDw7OaMYwEbHMOxEZ1lqVRYP2OAw==", + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.2.0.tgz", + "integrity": "sha512-E5LDX7Wrp85Kil5bhZv46j8jOeboKq5JMmYM3gVGdGH8xFpPWXUMsNrlODCrkoxMEeNi/XZIwuRvY4XNwYMJpw==", "dev": true }, "node_modules/sha.js": { @@ -10036,6 +10253,20 @@ "integrity": "sha512-vFwSUfQvqybiICwZY5+DAWIPLKsWO31Q91JSKl3UYv+K5c2QRPzn0qzec6QPu1Qc9eHYItiP3NdJqNVqetYAww==", "dev": true }, + "node_modules/side-channel": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/side-channel/-/side-channel-1.0.4.tgz", + "integrity": "sha512-q5XPytqFEIKHkGdiMIrY10mvLRvnQh42/+GoBlFW3b2LXLE2xxJpZFdm94we0BaoV3RwJyGqg5wS7epxTv0Zvw==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.0", + "get-intrinsic": "^1.0.2", + "object-inspect": "^1.9.0" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, "node_modules/signal-exit": { "version": "3.0.3", "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.3.tgz", @@ -11071,9 +11302,9 @@ } }, "node_modules/toidentifier": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/toidentifier/-/toidentifier-1.0.0.tgz", - "integrity": "sha512-yaOH/Pk/VEhBWWTlhI+qXxDFXlejDGcQipMlyxda9nthulaxLZUNcUqFxokp0vcYnvteJln5FNQDRrxj3YcbVw==", + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/toidentifier/-/toidentifier-1.0.1.tgz", + "integrity": "sha512-o5sSPKEkg/DIQNmH43V0/uerLrpzVedkUh8tGNvaeXpfpuwjKenlSox/2O/BTlZUtEe+JG7s5YhEz608PlAHRA==", "dev": true, "engines": { "node": ">=0.6" @@ -13838,13 +14069,13 @@ "dev": true }, "accepts": { - "version": "1.3.7", - "resolved": "https://registry.npmjs.org/accepts/-/accepts-1.3.7.tgz", - "integrity": "sha512-Il80Qs2WjYlJIBNzNkK6KYqlVMTbZLXgHx2oT0pU/fjRHyEp+PEfEPY0R3WCwAGVOtauxh1hOxNgIf5bv7dQpA==", + "version": "1.3.8", + "resolved": "https://registry.npmjs.org/accepts/-/accepts-1.3.8.tgz", + "integrity": "sha512-PYAthTa2m2VKxuvSD3DPC/Gy+U+sOA1LAuT8mkmRuvw+NACSaeXEQ+NHcVF7rONl6qcaxV3Uuemwawk+7+SJLw==", "dev": true, "requires": { - "mime-types": "~2.1.24", - "negotiator": "0.6.2" + "mime-types": "~2.1.34", + "negotiator": "0.6.3" } }, "acorn": { @@ -14342,27 +14573,29 @@ "dev": true }, "body-parser": { - "version": "1.19.0", - "resolved": "https://registry.npmjs.org/body-parser/-/body-parser-1.19.0.tgz", - "integrity": "sha512-dhEPs72UPbDnAQJ9ZKMNTP6ptJaionhP5cBb541nXPlW60Jepo9RV/a4fX4XWW9CuFNK22krhrj1+rgzifNCsw==", + "version": "1.20.1", + "resolved": "https://registry.npmjs.org/body-parser/-/body-parser-1.20.1.tgz", + "integrity": "sha512-jWi7abTbYwajOytWCQc37VulmWiRae5RyTpaCyDcS5/lMdtwSz5lOpDE67srw/HYe35f1z3fDQw+3txg7gNtWw==", "dev": true, "requires": { - "bytes": "3.1.0", + "bytes": "3.1.2", "content-type": "~1.0.4", "debug": "2.6.9", - "depd": "~1.1.2", - "http-errors": "1.7.2", + "depd": "2.0.0", + "destroy": "1.2.0", + "http-errors": "2.0.0", "iconv-lite": "0.4.24", - "on-finished": "~2.3.0", - "qs": "6.7.0", - "raw-body": "2.4.0", - "type-is": "~1.6.17" + "on-finished": "2.4.1", + "qs": "6.11.0", + "raw-body": "2.5.1", + "type-is": "~1.6.18", + "unpipe": "1.0.0" }, "dependencies": { "bytes": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.1.0.tgz", - "integrity": "sha512-zauLjrfCG+xvoyaqLoV8bLVXXNGC4JqlxFCutSDWA6fJrTo2ZuvLYTqZ7aHBLZSMOopbzwv8f+wZcVzfVTI2Dg==", + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.1.2.tgz", + "integrity": "sha512-/Nf7TyzTx6S3yRJObOAV7956r8cr2+Oj8AC5dt8wSP3BQAoeX58NoHyCU8P8zGkNXStjTSi6fzO6F0pBdcYbEg==", "dev": true }, "debug": { @@ -14374,11 +14607,32 @@ "ms": "2.0.0" } }, + "depd": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/depd/-/depd-2.0.0.tgz", + "integrity": "sha512-g7nH6P6dyDioJogAAGprGpCtVImJhpPk/roCzdb3fIh61/s/nPsfR6onyMwkCAR/OlC3yBC0lESvUoQEAssIrw==", + "dev": true + }, + "destroy": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/destroy/-/destroy-1.2.0.tgz", + "integrity": "sha512-2sJGJTaXIIaR1w4iJSNoN0hnMY7Gpc/n8D4qSCJw8QqFWXf7cuAgnEHxBpweaVcPevC2l3KpjYCx3NypQQgaJg==", + "dev": true + }, "ms": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", - "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=", + "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==", "dev": true + }, + "on-finished": { + "version": "2.4.1", + "resolved": "https://registry.npmjs.org/on-finished/-/on-finished-2.4.1.tgz", + "integrity": "sha512-oVlzkg3ENAhCk2zdv7IJwd/QUD4z2RxRwpkcGY8psCVcCYZNq4wYnVWALHM+brtuJjePWiYF/ClmuDr8Ch5+kg==", + "dev": true, + "requires": { + "ee-first": "1.1.1" + } } } }, @@ -15087,6 +15341,16 @@ "unset-value": "^1.0.0" } }, + "call-bind": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/call-bind/-/call-bind-1.0.2.tgz", + "integrity": "sha512-7O+FbCihrB5WGbFYesctwmTKae6rOiIzmz1icreWJ+0aA7LJfuqhEso2T9ncpcFtzMQtzXf2QGGueWJGTYsqrA==", + "dev": true, + "requires": { + "function-bind": "^1.1.1", + "get-intrinsic": "^1.0.2" + } + }, "call-me-maybe": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/call-me-maybe/-/call-me-maybe-1.0.1.tgz", @@ -15541,12 +15805,20 @@ "dev": true }, "content-disposition": { - "version": "0.5.3", - "resolved": "https://registry.npmjs.org/content-disposition/-/content-disposition-0.5.3.tgz", - "integrity": "sha512-ExO0774ikEObIAEV9kDo50o+79VCUdEB6n6lzKgGwupcVeRlhrj3qGAfwq8G6uBJjkqLrhT0qEYFcWng8z1z0g==", + "version": "0.5.4", + "resolved": "https://registry.npmjs.org/content-disposition/-/content-disposition-0.5.4.tgz", + "integrity": "sha512-FveZTNuGw04cxlAiWbzi6zTAL/lhehaWbTtgluJh4/E95DqMwTmha3KZN1aAWA8cFIhHzMZUvLevkw5Rqk+tSQ==", "dev": true, "requires": { - "safe-buffer": "5.1.2" + "safe-buffer": "5.2.1" + }, + "dependencies": { + "safe-buffer": { + "version": "5.2.1", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz", + "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==", + "dev": true + } } }, "content-type": { @@ -15565,9 +15837,9 @@ } }, "cookie": { - "version": "0.4.0", - "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.4.0.tgz", - "integrity": "sha512-+Hp8fLp57wnUSt0tY0tHEXh4voZRDnoIrZPqlo3DPiI4y9lwg/jqx+1Om94/W6ZaPDOUbnjOt/99w66zk+l1Xg==", + "version": "0.5.0", + "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.5.0.tgz", + "integrity": "sha512-YZ3GUyn/o8gfKJlnlX7g7xq4gyO6OSuhGPKaaGssGB2qgDUS0gPgtTvoyZLTt9Ab6dC4hfc9dV5arkvc/OCmrw==", "dev": true }, "cookie-signature": { @@ -16752,38 +17024,39 @@ } }, "express": { - "version": "4.17.1", - "resolved": "https://registry.npmjs.org/express/-/express-4.17.1.tgz", - "integrity": "sha512-mHJ9O79RqluphRrcw2X/GTh3k9tVv8YcoyY4Kkh4WDMUYKRZUq0h1o0w2rrrxBqM7VoeUVqgb27xlEMXTnYt4g==", + "version": "4.18.2", + "resolved": "https://registry.npmjs.org/express/-/express-4.18.2.tgz", + "integrity": "sha512-5/PsL6iGPdfQ/lKM1UuielYgv3BUoJfz1aUwU9vHZ+J7gyvwdQXFEBIEIaxeGf0GIcreATNyBExtalisDbuMqQ==", "dev": true, "requires": { - "accepts": "~1.3.7", + "accepts": "~1.3.8", "array-flatten": "1.1.1", - "body-parser": "1.19.0", - "content-disposition": "0.5.3", + "body-parser": "1.20.1", + "content-disposition": "0.5.4", "content-type": "~1.0.4", - "cookie": "0.4.0", + "cookie": "0.5.0", "cookie-signature": "1.0.6", "debug": "2.6.9", - "depd": "~1.1.2", + "depd": "2.0.0", "encodeurl": "~1.0.2", "escape-html": "~1.0.3", "etag": "~1.8.1", - "finalhandler": "~1.1.2", + "finalhandler": "1.2.0", "fresh": "0.5.2", + "http-errors": "2.0.0", "merge-descriptors": "1.0.1", "methods": "~1.1.2", - "on-finished": "~2.3.0", + "on-finished": "2.4.1", "parseurl": "~1.3.3", "path-to-regexp": "0.1.7", - "proxy-addr": "~2.0.5", - "qs": "6.7.0", + "proxy-addr": "~2.0.7", + "qs": "6.11.0", "range-parser": "~1.2.1", - "safe-buffer": "5.1.2", - "send": "0.17.1", - "serve-static": "1.14.1", - "setprototypeof": "1.1.1", - "statuses": "~1.5.0", + "safe-buffer": "5.2.1", + "send": "0.18.0", + "serve-static": "1.15.0", + "setprototypeof": "1.2.0", + "statuses": "2.0.1", "type-is": "~1.6.18", "utils-merge": "1.0.1", "vary": "~1.1.2" @@ -16804,11 +17077,38 @@ "ms": "2.0.0" } }, + "depd": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/depd/-/depd-2.0.0.tgz", + "integrity": "sha512-g7nH6P6dyDioJogAAGprGpCtVImJhpPk/roCzdb3fIh61/s/nPsfR6onyMwkCAR/OlC3yBC0lESvUoQEAssIrw==", + "dev": true + }, "ms": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=", "dev": true + }, + "on-finished": { + "version": "2.4.1", + "resolved": "https://registry.npmjs.org/on-finished/-/on-finished-2.4.1.tgz", + "integrity": "sha512-oVlzkg3ENAhCk2zdv7IJwd/QUD4z2RxRwpkcGY8psCVcCYZNq4wYnVWALHM+brtuJjePWiYF/ClmuDr8Ch5+kg==", + "dev": true, + "requires": { + "ee-first": "1.1.1" + } + }, + "safe-buffer": { + "version": "5.2.1", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz", + "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==", + "dev": true + }, + "statuses": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/statuses/-/statuses-2.0.1.tgz", + "integrity": "sha512-RwNA9Z/7PrK06rYLIzFMlaF+l73iwpzsqRIFgbMLbTcLD6cOao82TaWefPXQvB2fOC4AjuYSEndS7N/mTCbkdQ==", + "dev": true } } }, @@ -17030,17 +17330,17 @@ } }, "finalhandler": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/finalhandler/-/finalhandler-1.1.2.tgz", - "integrity": "sha512-aAWcW57uxVNrQZqFXjITpW3sIUQmHGG3qSb9mUah9MgMC4NeWhNOlNjXEYq3HjRAvL6arUviZGGJsBg6z0zsWA==", + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/finalhandler/-/finalhandler-1.2.0.tgz", + "integrity": "sha512-5uXcUVftlQMFnWC9qu/svkWv3GTd2PfUhK/3PLkYNAe7FbqJMt3515HaxE6eRL74GdsriiwujiawdaB1BpEISg==", "dev": true, "requires": { "debug": "2.6.9", "encodeurl": "~1.0.2", "escape-html": "~1.0.3", - "on-finished": "~2.3.0", + "on-finished": "2.4.1", "parseurl": "~1.3.3", - "statuses": "~1.5.0", + "statuses": "2.0.1", "unpipe": "~1.0.0" }, "dependencies": { @@ -17056,7 +17356,22 @@ "ms": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", - "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=", + "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==", + "dev": true + }, + "on-finished": { + "version": "2.4.1", + "resolved": "https://registry.npmjs.org/on-finished/-/on-finished-2.4.1.tgz", + "integrity": "sha512-oVlzkg3ENAhCk2zdv7IJwd/QUD4z2RxRwpkcGY8psCVcCYZNq4wYnVWALHM+brtuJjePWiYF/ClmuDr8Ch5+kg==", + "dev": true, + "requires": { + "ee-first": "1.1.1" + } + }, + "statuses": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/statuses/-/statuses-2.0.1.tgz", + "integrity": "sha512-RwNA9Z/7PrK06rYLIzFMlaF+l73iwpzsqRIFgbMLbTcLD6cOao82TaWefPXQvB2fOC4AjuYSEndS7N/mTCbkdQ==", "dev": true } } @@ -17116,9 +17431,9 @@ "dev": true }, "forwarded": { - "version": "0.1.2", - "resolved": "https://registry.npmjs.org/forwarded/-/forwarded-0.1.2.tgz", - "integrity": "sha1-mMI9qxF1ZXuMBXPozszZGw/xjIQ=", + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/forwarded/-/forwarded-0.2.0.tgz", + "integrity": "sha512-buRG0fpBtRHSTCOASe6hD258tEubFoRLb4ZNA6NxMVHNw2gOcwHo9wyablzMzOA5z9xA9L1KNjk/Nt6MT9aYow==", "dev": true }, "fragment-cache": { @@ -17251,6 +17566,17 @@ "integrity": "sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==", "dev": true }, + "get-intrinsic": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.1.3.tgz", + "integrity": "sha512-QJVz1Tj7MS099PevUG5jvnt9tSkXN8K14dxQlikJuPt4uD9hHAHjLyLBiLR5zELelBdD9QNRAXZzsJx0WaDL9A==", + "dev": true, + "requires": { + "function-bind": "^1.1.1", + "has": "^1.0.3", + "has-symbols": "^1.0.3" + } + }, "get-stream": { "version": "4.1.0", "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-4.1.0.tgz", @@ -17414,9 +17740,9 @@ "dev": true }, "has-symbols": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.0.1.tgz", - "integrity": "sha512-PLcsoqu++dmEIZB+6totNFKq/7Do+Z0u4oT0zKOJNl3lYK6vGwwu2hjHs+68OEZbTjiUE9bgOABXbP/GvrS0Kg==", + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.0.3.tgz", + "integrity": "sha512-l3LCuF6MgDNwTDKkdYGEihYjt5pRPbEg46rtlmnSPlUbgmB8LOIrKJbYYFBSbnPaJexMKtiPO8hmeRjRz2Td+A==", "dev": true }, "has-value": { @@ -17602,22 +17928,28 @@ "dev": true }, "http-errors": { - "version": "1.7.2", - "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-1.7.2.tgz", - "integrity": "sha512-uUQBt3H/cSIVfch6i1EuPNy/YsRSOUBXTVfZ+yR7Zjez3qjBz6i9+i4zjNaoqcoFVI4lQJ5plg63TvGfRSDCRg==", + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-2.0.0.tgz", + "integrity": "sha512-FtwrG/euBzaEjYeRqOgly7G0qviiXoJWnvEH2Z1plBdXgbyjv34pHTSb9zoeHMyDy33+DWy5Wt9Wo+TURtOYSQ==", "dev": true, "requires": { - "depd": "~1.1.2", - "inherits": "2.0.3", - "setprototypeof": "1.1.1", - "statuses": ">= 1.5.0 < 2", - "toidentifier": "1.0.0" + "depd": "2.0.0", + "inherits": "2.0.4", + "setprototypeof": "1.2.0", + "statuses": "2.0.1", + "toidentifier": "1.0.1" }, "dependencies": { - "inherits": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.3.tgz", - "integrity": "sha1-Yzwsg+PaQqUC9SRmAiSA9CCCYd4=", + "depd": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/depd/-/depd-2.0.0.tgz", + "integrity": "sha512-g7nH6P6dyDioJogAAGprGpCtVImJhpPk/roCzdb3fIh61/s/nPsfR6onyMwkCAR/OlC3yBC0lESvUoQEAssIrw==", + "dev": true + }, + "statuses": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/statuses/-/statuses-2.0.1.tgz", + "integrity": "sha512-RwNA9Z/7PrK06rYLIzFMlaF+l73iwpzsqRIFgbMLbTcLD6cOao82TaWefPXQvB2fOC4AjuYSEndS7N/mTCbkdQ==", "dev": true } } @@ -18619,7 +18951,7 @@ "media-typer": { "version": "0.3.0", "resolved": "https://registry.npmjs.org/media-typer/-/media-typer-0.3.0.tgz", - "integrity": "sha1-hxDXrwqmJvj/+hzgAWhUUmMlV0g=", + "integrity": "sha512-dq+qelQ9akHpcOl/gUVRTxVIOkAJ1wR3QAvb4RsVjS8oVoFjDGTc679wJYmUmknUF5HwMLOgb5O+a3KxfWapPQ==", "dev": true }, "memory-fs": { @@ -18719,18 +19051,18 @@ "dev": true }, "mime-db": { - "version": "1.44.0", - "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.44.0.tgz", - "integrity": "sha512-/NOTfLrsPBVeH7YtFPgsVWveuL+4SjjYxaQ1xtM1KMFj7HdxlBlxeyNLzhyJVx7r4rZGJAZ/6lkKCitSc/Nmpg==", + "version": "1.52.0", + "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.52.0.tgz", + "integrity": "sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==", "dev": true }, "mime-types": { - "version": "2.1.27", - "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.27.tgz", - "integrity": "sha512-JIhqnCasI9yD+SsmkquHBxTSEuZdQX5BuQnS2Vc7puQQQ+8yiP5AY5uWhpdv4YL4VM5c6iliiYWPgJ/nJQLp7w==", + "version": "2.1.35", + "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.35.tgz", + "integrity": "sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==", "dev": true, "requires": { - "mime-db": "1.44.0" + "mime-db": "1.52.0" } }, "minimalistic-assert": { @@ -18908,9 +19240,9 @@ } }, "negotiator": { - "version": "0.6.2", - "resolved": "https://registry.npmjs.org/negotiator/-/negotiator-0.6.2.tgz", - "integrity": "sha512-hZXc7K2e+PgeI1eDBe/10Ard4ekbfrrqG8Ep+8Jmf4JID2bNg7NvCPOZN+kfF574pFQI7mum2AUqDidoKqcTOw==", + "version": "0.6.3", + "resolved": "https://registry.npmjs.org/negotiator/-/negotiator-0.6.3.tgz", + "integrity": "sha512-+EUsqGPLsM+j/zdChZjsnX51g4XrHFOIXwfnCVPGlQk/k5giakcKsuxCObBRu6DSm9opw/O6slWbJdghQM4bBg==", "dev": true }, "neo-async": { @@ -19078,9 +19410,9 @@ } }, "object-inspect": { - "version": "1.8.0", - "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.8.0.tgz", - "integrity": "sha512-jLdtEOB112fORuypAyl/50VRVIBIdVQOSUUGQHzJ4xBSbit81zRarz7GThkEFZy1RceYrWYcPcBFPQwHyAc1gA==", + "version": "1.12.2", + "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.12.2.tgz", + "integrity": "sha512-z+cPxW0QGUp0mcqcsgQyLVRDoXFQbXOwBaqyF7VIgI4TWNQsDHrBpUQslRmIfAoYWdYzs6UlKJtB2XJpTaNSpQ==", "dev": true }, "object-is": { @@ -20237,12 +20569,12 @@ "dev": true }, "proxy-addr": { - "version": "2.0.6", - "resolved": "https://registry.npmjs.org/proxy-addr/-/proxy-addr-2.0.6.tgz", - "integrity": "sha512-dh/frvCBVmSsDYzw6n926jv974gddhkFPfiN8hPOi30Wax25QZyZEGveluCgliBnqmuM+UJmBErbAUFIoDbjOw==", + "version": "2.0.7", + "resolved": "https://registry.npmjs.org/proxy-addr/-/proxy-addr-2.0.7.tgz", + "integrity": "sha512-llQsMLSUDUPT44jdrU/O37qlnifitDP+ZwrmmZcoSKyLKvtZxpyV0n2/bD/N4tBAAZ/gJEdZU7KMraoK1+XYAg==", "dev": true, "requires": { - "forwarded": "~0.1.2", + "forwarded": "0.2.0", "ipaddr.js": "1.9.1" } }, @@ -20326,10 +20658,13 @@ "dev": true }, "qs": { - "version": "6.7.0", - "resolved": "https://registry.npmjs.org/qs/-/qs-6.7.0.tgz", - "integrity": "sha512-VCdBRNFTX1fyE7Nb6FYoURo/SPe62QCaAyzJvUjwRaIsc+NePBEniHlvxFmmX56+HZphIGtV0XeCirBtpDrTyQ==", - "dev": true + "version": "6.11.0", + "resolved": "https://registry.npmjs.org/qs/-/qs-6.11.0.tgz", + "integrity": "sha512-MvjoMCJwEarSbUYk5O+nmoSzSutSsTwF85zcHPQ9OrlFoZOYIjaqBAJIqIXjptyD5vThxGq52Xu/MaJzRkIk4Q==", + "dev": true, + "requires": { + "side-channel": "^1.0.4" + } }, "querystring": { "version": "0.2.0", @@ -20375,21 +20710,21 @@ "dev": true }, "raw-body": { - "version": "2.4.0", - "resolved": "https://registry.npmjs.org/raw-body/-/raw-body-2.4.0.tgz", - "integrity": "sha512-4Oz8DUIwdvoa5qMJelxipzi/iJIi40O5cGV1wNYp5hvZP8ZN0T+jiNkL0QepXs+EsQ9XJ8ipEDoiH70ySUJP3Q==", + "version": "2.5.1", + "resolved": "https://registry.npmjs.org/raw-body/-/raw-body-2.5.1.tgz", + "integrity": "sha512-qqJBtEyVgS0ZmPGdCFPWJ3FreoqvG4MVQln/kCgF7Olq95IbOp0/BWyMwbdtn4VTvkM8Y7khCQ2Xgk/tcrCXig==", "dev": true, "requires": { - "bytes": "3.1.0", - "http-errors": "1.7.2", + "bytes": "3.1.2", + "http-errors": "2.0.0", "iconv-lite": "0.4.24", "unpipe": "1.0.0" }, "dependencies": { "bytes": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.1.0.tgz", - "integrity": "sha512-zauLjrfCG+xvoyaqLoV8bLVXXNGC4JqlxFCutSDWA6fJrTo2ZuvLYTqZ7aHBLZSMOopbzwv8f+wZcVzfVTI2Dg==", + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.1.2.tgz", + "integrity": "sha512-/Nf7TyzTx6S3yRJObOAV7956r8cr2+Oj8AC5dt8wSP3BQAoeX58NoHyCU8P8zGkNXStjTSi6fzO6F0pBdcYbEg==", "dev": true } } @@ -20875,24 +21210,24 @@ "dev": true }, "send": { - "version": "0.17.1", - "resolved": "https://registry.npmjs.org/send/-/send-0.17.1.tgz", - "integrity": "sha512-BsVKsiGcQMFwT8UxypobUKyv7irCNRHk1T0G680vk88yf6LBByGcZJOTJCrTP2xVN6yI+XjPJcNuE3V4fT9sAg==", + "version": "0.18.0", + "resolved": "https://registry.npmjs.org/send/-/send-0.18.0.tgz", + "integrity": "sha512-qqWzuOjSFOuqPjFe4NOsMLafToQQwBSOEpS+FwEt3A2V3vKubTquT3vmLTQpFgMXp8AlFWFuP1qKaJZOtPpVXg==", "dev": true, "requires": { "debug": "2.6.9", - "depd": "~1.1.2", - "destroy": "~1.0.4", + "depd": "2.0.0", + "destroy": "1.2.0", "encodeurl": "~1.0.2", "escape-html": "~1.0.3", "etag": "~1.8.1", "fresh": "0.5.2", - "http-errors": "~1.7.2", + "http-errors": "2.0.0", "mime": "1.6.0", - "ms": "2.1.1", - "on-finished": "~2.3.0", + "ms": "2.1.3", + "on-finished": "2.4.1", "range-parser": "~1.2.1", - "statuses": "~1.5.0" + "statuses": "2.0.1" }, "dependencies": { "debug": { @@ -20907,15 +21242,42 @@ "ms": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", - "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=", + "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==", "dev": true } } }, + "depd": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/depd/-/depd-2.0.0.tgz", + "integrity": "sha512-g7nH6P6dyDioJogAAGprGpCtVImJhpPk/roCzdb3fIh61/s/nPsfR6onyMwkCAR/OlC3yBC0lESvUoQEAssIrw==", + "dev": true + }, + "destroy": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/destroy/-/destroy-1.2.0.tgz", + "integrity": "sha512-2sJGJTaXIIaR1w4iJSNoN0hnMY7Gpc/n8D4qSCJw8QqFWXf7cuAgnEHxBpweaVcPevC2l3KpjYCx3NypQQgaJg==", + "dev": true + }, "ms": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.1.tgz", - "integrity": "sha512-tgp+dl5cGk28utYktBsrFqA7HKgrhgPsg6Z/EfhWI4gl1Hwq8B/GmY/0oXZ6nF8hDVesS/FpnYaD/kOWhYQvyg==", + "version": "2.1.3", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", + "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==", + "dev": true + }, + "on-finished": { + "version": "2.4.1", + "resolved": "https://registry.npmjs.org/on-finished/-/on-finished-2.4.1.tgz", + "integrity": "sha512-oVlzkg3ENAhCk2zdv7IJwd/QUD4z2RxRwpkcGY8psCVcCYZNq4wYnVWALHM+brtuJjePWiYF/ClmuDr8Ch5+kg==", + "dev": true, + "requires": { + "ee-first": "1.1.1" + } + }, + "statuses": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/statuses/-/statuses-2.0.1.tgz", + "integrity": "sha512-RwNA9Z/7PrK06rYLIzFMlaF+l73iwpzsqRIFgbMLbTcLD6cOao82TaWefPXQvB2fOC4AjuYSEndS7N/mTCbkdQ==", "dev": true } } @@ -20986,15 +21348,15 @@ } }, "serve-static": { - "version": "1.14.1", - "resolved": "https://registry.npmjs.org/serve-static/-/serve-static-1.14.1.tgz", - "integrity": "sha512-JMrvUwE54emCYWlTI+hGrGv5I8dEwmco/00EvkzIIsR7MqrHonbD9pO2MOfFnpFntl7ecpZs+3mW+XbQZu9QCg==", + "version": "1.15.0", + "resolved": "https://registry.npmjs.org/serve-static/-/serve-static-1.15.0.tgz", + "integrity": "sha512-XGuRDNjXUijsUL0vl6nSD7cwURuzEgglbOaFuZM9g3kwDXOWVTck0jLzjPzGD+TazWbboZYu52/9/XPdUgne9g==", "dev": true, "requires": { "encodeurl": "~1.0.2", "escape-html": "~1.0.3", "parseurl": "~1.3.3", - "send": "0.17.1" + "send": "0.18.0" } }, "server-destroy": { @@ -21045,9 +21407,9 @@ "dev": true }, "setprototypeof": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.1.1.tgz", - "integrity": "sha512-JvdAWfbXeIGaZ9cILp38HntZSFSo3mWg6xGcJJsd+d4aRMOqauag1C63dJfDw7OaMYwEbHMOxEZ1lqVRYP2OAw==", + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.2.0.tgz", + "integrity": "sha512-E5LDX7Wrp85Kil5bhZv46j8jOeboKq5JMmYM3gVGdGH8xFpPWXUMsNrlODCrkoxMEeNi/XZIwuRvY4XNwYMJpw==", "dev": true }, "sha.js": { @@ -21090,6 +21452,17 @@ "integrity": "sha512-vFwSUfQvqybiICwZY5+DAWIPLKsWO31Q91JSKl3UYv+K5c2QRPzn0qzec6QPu1Qc9eHYItiP3NdJqNVqetYAww==", "dev": true }, + "side-channel": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/side-channel/-/side-channel-1.0.4.tgz", + "integrity": "sha512-q5XPytqFEIKHkGdiMIrY10mvLRvnQh42/+GoBlFW3b2LXLE2xxJpZFdm94we0BaoV3RwJyGqg5wS7epxTv0Zvw==", + "dev": true, + "requires": { + "call-bind": "^1.0.0", + "get-intrinsic": "^1.0.2", + "object-inspect": "^1.9.0" + } + }, "signal-exit": { "version": "3.0.3", "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.3.tgz", @@ -21953,9 +22326,9 @@ } }, "toidentifier": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/toidentifier/-/toidentifier-1.0.0.tgz", - "integrity": "sha512-yaOH/Pk/VEhBWWTlhI+qXxDFXlejDGcQipMlyxda9nthulaxLZUNcUqFxokp0vcYnvteJln5FNQDRrxj3YcbVw==", + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/toidentifier/-/toidentifier-1.0.1.tgz", + "integrity": "sha512-o5sSPKEkg/DIQNmH43V0/uerLrpzVedkUh8tGNvaeXpfpuwjKenlSox/2O/BTlZUtEe+JG7s5YhEz608PlAHRA==", "dev": true }, "tslib": { From 9bdaed69700867405a03456285b57f386c63e9f3 Mon Sep 17 00:00:00 2001 From: Karim Mourra Date: Thu, 8 Dec 2022 14:36:22 -0500 Subject: [PATCH 148/280] adds refs to jw docs (#4195) --- dev-docs/modules/jwplayerVideoProvider.md | 6 ++++++ prebid-video/video-module.md | 2 +- 2 files changed, 7 insertions(+), 1 deletion(-) diff --git a/dev-docs/modules/jwplayerVideoProvider.md b/dev-docs/modules/jwplayerVideoProvider.md index 451f4986c1..ddcf76572a 100644 --- a/dev-docs/modules/jwplayerVideoProvider.md +++ b/dev-docs/modules/jwplayerVideoProvider.md @@ -17,3 +17,9 @@ The JW Player Video Provider is a submodule of the Prebid Video Module. The JW Player Vendor Code for the Video Module is `1`. For information on how to use the Video Module with JW Player please visit the [docs]({{site.github.url}}/prebid-video/video-module.html). + +## Additional Information + +- If you would like to further customize your JW Player experience, please visit our [Developer docs](https://docs.jwplayer.com/players/docs/jw8-overview). +- To sign up for a developer account: [Developer sign up](https://info.jwplayer.com/sign-up/?utm_source=developer&utm_medium=CTA). +- To learn more [about us](https://www.jwplayer.com/). diff --git a/prebid-video/video-module.md b/prebid-video/video-module.md index c6884ad33a..ea684fef3f 100644 --- a/prebid-video/video-module.md +++ b/prebid-video/video-module.md @@ -38,7 +38,7 @@ The following Video Players are currently supported: {: .table .table-bordered .table-striped } | Video Player | Submodule Name | Vendor Code | |--------------|----------------|-------------| -| [JW Player](https://www.jwplayer.com/) | jwplayerVideoProvider | 1 | +| [JW Player](https://info.jwplayer.com/sign-up/?utm_source=developer&utm_medium=CTA) | jwplayerVideoProvider | 1 | | [video.js](https://videojs.com/) | videojsVideoProvider | 2 | Not seeing your desired video player ? Learn how to add support by reading our [contribution guide](#Video-Module-Contributing) From 04b23fbc3b28b95f82ee33001cbba51d8b72f620 Mon Sep 17 00:00:00 2001 From: Marcin Wrobel Date: Thu, 8 Dec 2022 20:38:29 +0100 Subject: [PATCH 149/280] OpenX Bid Addapter: update dev docs (#4193) --- dev-docs/bidders/openx.md | 17 +++++++++++------ 1 file changed, 11 insertions(+), 6 deletions(-) diff --git a/dev-docs/bidders/openx.md b/dev-docs/bidders/openx.md index 64149b1255..6d28252fae 100644 --- a/dev-docs/bidders/openx.md +++ b/dev-docs/bidders/openx.md @@ -34,13 +34,16 @@ IMPORTANT: only include either openxBidAdapter or openxOrtbBidAdapter in your bu {: .table .table-bordered .table-striped } | Name | Scope | Description | Example | Type | | ---- | ----- | ----------- | ------- | ---- | -| `delDomain` or `platform` | required | OpenX delivery domain or platform id provided by your OpenX representative. Both may be present. `platform` is preferred | "PUBLISHER-d.openx.net" or "555not5a-real-plat-form-id0123456789" | String | +| `delDomain` ~~or `platform`~~** | required | OpenX delivery domain provided by your OpenX representative. | "PUBLISHER-d.openx.net" | String | | `unit` | required | OpenX ad unit ID provided by your OpenX representative. | "1611023122" | String | | `customParams` | optional | User-defined targeting key-value pairs. customParams applies to a specific unit. | `{key1: "v1", key2: ["v2","v3"]}` | Object | -| `customFloor` | optional | Minimum price in USD. customFloor applies to a specific unit. For example, use the following value to set a $1.50 floor: 1.50

**WARNING:**
Misuse of this parameter can impact revenue | 1.50 | Number | +| `customFloor` | optional | Minimum price in USD. customFloor applies to a specific unit. For example, use the following value to set a $1.50 floor: 1.50

**WARNING:**
Misuse of this parameter can impact revenue.

Note:
OpenX suggests using the [Price Floor Module](/dev-docs/modules/floors.html) instead of customFloor. The Price Floor Module is prioritized over customFloor if both are present. | 1.50 | Number | | `doNotTrack` | optional | Prevents advertiser from using data for this user.

**WARNING:**
Impacts all bids in the request. May impact revenue. | true | Boolean | | `coppa` | optional | Enables Child's Online Privacy Protection Act (COPPA) regulations. **WARNING:**
Impacts all bids in the request. May impact revenue. | true | Boolean | +** platform is deprecated. Please use delDomain instead. If you have any questions please contact your representative. + + ### AdUnit Format for Banner ```javascript var adUnits = [ @@ -63,7 +66,7 @@ var adUnits = [ bidder: 'openx', params: { unit: '539439964', - platform: 'a3aece0c-9e80-4316-8deb-faf804779bd1', + delDomain: 'se-demo-d.openx.net', customParams: { key1: 'v1', key2: ['v2', 'v3'] @@ -81,7 +84,9 @@ var adUnits = [ | Name | Scope | Description | Example | Type | | ---- | ----- | ----------- | ------- | ---- | | `unit` | required | OpenX ad unit ID provided by your OpenX representative. | "1611023122" | String | -| `delDomain` or `platform` | required | OpenX delivery domain or platform id provided by your OpenX representative. Both may be present. `platform` is preferred | "PUBLISHER-d.openx.net" or "555not5a-real-plat-form-id0123456789" | String | +| `delDomain` ~~or `platform`~~** | required | OpenX delivery domain provided by your OpenX representative. | "PUBLISHER-d.openx.net" | String | + +** platform is deprecated. Please use delDomain instead. If you have any questions please contact your representative. #### mediaTypes.video @@ -163,7 +168,7 @@ var adUnits = [ bidder: 'openx', params: { unit: '539439964', - platform: 'a3aece0c-9e80-4316-8deb-faf804779bd1', + delDomain: 'se-demo-d.openx.net', customParams: { key1: 'v1', key2: ['v2', 'v3'] @@ -193,7 +198,7 @@ var adUnits = [ ``` #### First Party Data -OpenX supports FPD configured under `ortb2.user`and `ortb2.site.content` as described [here]((/features/firstPartyData.html)). +OpenX supports FPD configured under `ortb2.user`and `ortb2.site.content` as described [here](/features/firstPartyData.html). Ad unit specific FPD is not supported, and segment taxonomies (`segtax`) are simply passed through. If you have any questions, please reach out to us at prebid@openx.com From 0d197b70e3156afbbc3a0ee3de29b8aec3daa22d Mon Sep 17 00:00:00 2001 From: bretg Date: Thu, 8 Dec 2022 14:40:56 -0500 Subject: [PATCH 150/280] updating site/app messaging (#4191) --- dev-docs/publisher-api-reference/setConfig.md | 26 ++++++++++++------- 1 file changed, 17 insertions(+), 9 deletions(-) diff --git a/dev-docs/publisher-api-reference/setConfig.md b/dev-docs/publisher-api-reference/setConfig.md index c944468db4..ac9b3bb55b 100644 --- a/dev-docs/publisher-api-reference/setConfig.md +++ b/dev-docs/publisher-api-reference/setConfig.md @@ -477,17 +477,23 @@ See the [Prebid Server module](/dev-docs/modules/prebidServer.html). #### Mobile App Post-Bid To support [post-bid](/overview/what-is-post-bid.html) scenarios on mobile apps, the -prebidServerBidAdapter module recognizes the `app` config object to +prebidServerBidAdapter module will accept `ortb2.app` config to forward details through the server: {% highlight js %} pbjs.setConfig({ - app: { + ortb2: { + app: { bundle: "org.prebid.mobile.demoapp", domain: "prebid.org" - } + } + } +}); {% endhighlight %} +{: .alert.alert-warning :} +In PBJS 4.29 and earlier, don't add the `ortb2` level here -- just `app` directly. Oh, and please upgrade. 4.29 was a long time ago. + #### Configure User Syncing @@ -1273,22 +1279,24 @@ More examples [here](/dev-docs/modules/instreamTracking.html#example-with-urlpat #### Site Configuration -{: .alert.alert-info :} -This setting is obsolete as of Prebid.js 4.30. Please set site fields in `ortb2.site` as [First Party Data](#setConfig-fpd). - Adapters, including Prebid Server adapters, can support taking site parameters like language. -The structure here is OpenRTB; the site object will be available to client- and server-side adapters. +Just set the `ortb2.site` object as First Party Data to make it available to client- and server-side adapters. {% highlight js %} pbjs.setConfig({ - site: { + ortb2: { + site: { content: { language: "en" } - } + } + } }); {% endhighlight %} +{: .alert.alert-warning :} +In PBJS 4.29 and earlier, don't add the `ortb2` level here -- just `site` directly. Oh, and please upgrade. 4.29 was a long time ago. + #### Auction Options From 16cd486299aa65ed59ba0a6a4ac5498b4ba76f2b Mon Sep 17 00:00:00 2001 From: BaronJHYu <254878848@qq.com> Date: Fri, 9 Dec 2022 03:44:19 +0800 Subject: [PATCH 151/280] update mediago.md & discovery.md (#4187) * Update mediago.md update compliance info * Update mediago.md * Update discovery.md * Update discovery.md * Update mediago.md * Update mediago.md * Update discovery.md --- dev-docs/bidders/discovery.md | 3 ++- dev-docs/bidders/mediago.md | 5 +++-- 2 files changed, 5 insertions(+), 3 deletions(-) diff --git a/dev-docs/bidders/discovery.md b/dev-docs/bidders/discovery.md index 3dec8630ca..118bc6d6d2 100644 --- a/dev-docs/bidders/discovery.md +++ b/dev-docs/bidders/discovery.md @@ -17,6 +17,7 @@ The DiscoveryDSP Bidding adapter requires setup before beginning. Please contact | Name | Scope | Description | Example | Type | |---------------|----------|-----------------------|-----------|-----------| | `token` | required | publisher token | `'1e100887dd614b7f69fdd1360437'` | `string` | +| `test` | recommend | 0(default): production env mode.
1: dev env mode and no charge.we will bid Higher frequency to make debug easier. | `1/0` | `Number` | | `tagid` | required | tagid | `'abcdefg'` | `string` | | `publisher` | required | publisher id | `'abcdefg'` | `string` | @@ -75,4 +76,4 @@ var adUnits = [ ]; ``` -`If the bid interface status code is 200, the bid is successful, if the status code is 204, there is no bid, please send the request parameters to media-support@popin.cc, we will be the first time to feedback` \ No newline at end of file +`If the bid interface status code is 200, the bid is successful, if the status code is 204, there is no bid, please send the request parameters to media-support@popin.cc, we will be the first time to feedback` diff --git a/dev-docs/bidders/mediago.md b/dev-docs/bidders/mediago.md index 7de150c5d3..461d50fd16 100644 --- a/dev-docs/bidders/mediago.md +++ b/dev-docs/bidders/mediago.md @@ -26,5 +26,6 @@ The MediaGo Bidding adapter requires setup before beginning. Please contact us a | Name | Scope | Description | Example | Type | |---------------|----------|-----------------------|-----------|-----------| | `token` | required | publisher token | `'1e100887dd614b7f69fdd1360437'` | `string` | -| bidfloor | recommend | Sets a floor price for the bid | 0.05 | float | -| placementId | recommend | The AD placement ID | 12341234 | string | +| `test` | recommend | 0(default): production env mode.
1: dev env mode and no charge.we will bid Higher frequency to make debug easier. | `1/0` | `Number` | +| `bidfloor` | recommend | Sets a floor price for the bid | `0.05` | `float` | +| `placementId` | recommend | The AD placement ID | `12341234` | `string` | From 58848633cad1470f1a0550c2cb02ec594466171c Mon Sep 17 00:00:00 2001 From: Chris Huie Date: Thu, 8 Dec 2022 12:45:10 -0700 Subject: [PATCH 152/280] Alert on ortb convesion and move up wording (#4184) * Alert on ortb convesion and add move up wording * add alert to text body * add space --- dev-docs/bidder-adaptor.md | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/dev-docs/bidder-adaptor.md b/dev-docs/bidder-adaptor.md index 62493b83f8..4f3c7cdcef 100644 --- a/dev-docs/bidder-adaptor.md +++ b/dev-docs/bidder-adaptor.md @@ -183,8 +183,13 @@ Prebid recommends keeping module HTTP requests 'simple' if at all possible. The {: .alert.alert-success :} If you're the type that likes to skip to the answer instead of going through a tutorial, see the
Full Bid Adapter Example below. +{: .alert.alert-warning :} +### Note on ORTB adapters + +{: .alert.alert-warning :} +If your adapter interfaces with an ORTB backend, you may take advantage of Prebid's [ORTB conversion library](https://github.com/prebid/Prebid.js/blob/master/libraries/ortbConverter/README.md), which provides most of the implementation for `buildRequests` and `interpretResponse`. + + [Overview](#bidder-adaptor-Overview) -+ [Note on ORTB adapters](#ortb-adapters) + [Building the Request](#bidder-adaptor-Building-the-Request) + [Interpreting the Response](#bidder-adaptor-Interpreting-the-Response) + [Registering User Syncs](#bidder-adaptor-Registering-User-Syncs) From 50840a9f20cff6f2bdee8c754eb2d01171f4d7ff Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Udi=20Talias=20=E2=9A=9B=EF=B8=8F?= Date: Thu, 8 Dec 2022 21:46:57 +0200 Subject: [PATCH 153/280] added media types (#4180) --- dev-docs/bidders/vidazoo.md | 1 + 1 file changed, 1 insertion(+) diff --git a/dev-docs/bidders/vidazoo.md b/dev-docs/bidders/vidazoo.md index 5baf2a5a15..16d522dcb5 100644 --- a/dev-docs/bidders/vidazoo.md +++ b/dev-docs/bidders/vidazoo.md @@ -4,6 +4,7 @@ title: Vidazoo description: Prebid Vidazoo Bidder Adaptor biddercode: vidazoo userIds: britepoolId, criteo, id5Id, identityLink, liveIntentId, netId, parrableId, pubCommonId, unifiedId +media_types: banner, video gdpr_supported: true usp_supported: true pbjs: true From 51e0fdaabc78ce79a7731bdcb347f7c80b57f10a Mon Sep 17 00:00:00 2001 From: AdmixerTech <35560933+AdmixerTech@users.noreply.github.com> Date: Thu, 8 Dec 2022 21:47:19 +0200 Subject: [PATCH 154/280] Add smn adapter (#4179) * add smn alias * add media types * add metadata * add gvl_id --- dev-docs/bidders/smn.md | 26 ++++++++++++++++++++++++++ 1 file changed, 26 insertions(+) create mode 100644 dev-docs/bidders/smn.md diff --git a/dev-docs/bidders/smn.md b/dev-docs/bidders/smn.md new file mode 100644 index 0000000000..7699aa5f3e --- /dev/null +++ b/dev-docs/bidders/smn.md @@ -0,0 +1,26 @@ +--- +layout: bidder +title: SMN +description: Prebid SMN Bidder Adaptor +pbjs: true +biddercode: smn +aliasCode: admixer +media_types: banner, video +gdpr_supported: true +usp_supported: true +gvl_id: 511 +fpd_supported: false +schain_supported: true +coppa_supported: false +deals_supported: true +ortb_blocking_supported: false +safeframes_ok: false +--- + +### Bid Params + +{: .table .table-bordered .table-striped } +| Name | Scope | Description | Example | Type | +|---------------|----------|------------------------------------------------------------------------------------------------------------------|----------------------------------------|----------| +| `zone` | required | The unique identifier of the ad placement. Could be obtained from the SMN UI or from your account manager. | "e5ff8e48-4bd0-4a2c-9236-55530ab8981d" | `string` | +| `kvTargeting` | optional | Key/Value - a pair of the unique values that will be used for the custom targeting option. | {key1: value2, key2: value2} | `object` | From 3bc1aa7deb062d738404e16f591fb77f69770d1d Mon Sep 17 00:00:00 2001 From: Alexander Pykhteyev Date: Fri, 9 Dec 2022 02:47:33 +0700 Subject: [PATCH 155/280] Update LimelightDigital adapter docs and add alias for IionAds (#4178) * Add project limelight docs * adding alias Because your actual adapter filename is different than your bidder-code, this alias will be needed for the download page to work * Update docs for LimelightDigital adapter and add docs for IionAds alias * Remove unused file * Rename IionAds to iionads * Rename IionAds to iionads Co-authored-by: bretg Co-authored-by: apykhteyev --- dev-docs/bidders/iionads.md | 31 ++++++++++++++++++++++++++++ dev-docs/bidders/limelightDigital.md | 16 ++++++++++++-- 2 files changed, 45 insertions(+), 2 deletions(-) create mode 100644 dev-docs/bidders/iionads.md diff --git a/dev-docs/bidders/iionads.md b/dev-docs/bidders/iionads.md new file mode 100644 index 0000000000..7dc9432659 --- /dev/null +++ b/dev-docs/bidders/iionads.md @@ -0,0 +1,31 @@ +--- +layout: bidder +title: iionads +description: iionads Bidder Adaptor +biddercode: iionads +pbjs: true +pbs: false +media_types: video, banner +userIds: all +fpd_supported: false +gdpr_supported: true +usp_supported: true +coppa_supported: true +schain_supported: true +prebid_member: false +ortb_blocking_supported: true +multiformat_supported: will-bid-on-one +floors_supported: false +aliasCode: limelightDigital +--- + +### Bid Params + +{: .table .table-bordered .table-striped } + +| Name | Scope | Description | Example |type| +| :----------- | :--------- | :------------ | :----------------- |:---| +| `host` | required | Ad network's RTB host | `'iionads.com'` | `string` | +| `adUnitId` | required | Ad Unit Id will be generated on iionads Platform. | 0 | `integer` | +| `adUnitType` | required | Type of Ad Unit (`'video'`, `'banner'`) | `'banner'` | `string` | +| `publisherId` | optional | Publisher ID | `'12345'` | `string` | diff --git a/dev-docs/bidders/limelightDigital.md b/dev-docs/bidders/limelightDigital.md index 9714e224f2..660456778e 100644 --- a/dev-docs/bidders/limelightDigital.md +++ b/dev-docs/bidders/limelightDigital.md @@ -2,14 +2,26 @@ layout: bidder title: Limelight Digital description: Prebid Limelight Digital Bidder Adaptor -pbjs: true biddercode: limelightDigital -media_types: video +pbjs: true +pbs: false +media_types: video, banner +userIds: all +fpd_supported: false +gdpr_supported: true +usp_supported: true +coppa_supported: true +schain_supported: true +prebid_member: false +ortb_blocking_supported: true +multiformat_supported: will-bid-on-one +floors_supported: false --- ### Bid Params {: .table .table-bordered .table-striped } + | Name | Scope | Description | Example |type| | :----------- | :--------- | :------------ | :----------------- |:---| | `host` | required | Ad network's RTB host | `'exchange.ortb.net'` | `string` | From 9181267f1b1cfbf41bb452339a9bbe77cf205990 Mon Sep 17 00:00:00 2001 From: bretg Date: Thu, 8 Dec 2022 14:49:31 -0500 Subject: [PATCH 156/280] reviewing module rules (#4164) The doc says "Even grandfathered modules must adhere to all required rules by Prebid.js 5.0." I'm aware of enforcements in a couple areas, but would like help reviewing the other rules for whether all bidders conform. --- dev-docs/module-rules.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/dev-docs/module-rules.md b/dev-docs/module-rules.md index 10f6c85650..ba9e530f76 100644 --- a/dev-docs/module-rules.md +++ b/dev-docs/module-rules.md @@ -74,7 +74,7 @@ The use of the terms "must" and "should" in this document is deliberate. Howeve ### Bidder Adapter Rules 1. All global rules apply. -1. Bid adapters must(*) be able to bid. If they cannot return an auction bid, they should consider integration as a Real-Time Data or other module type. +1. Bid adapters must be able to bid. If they cannot return an auction bid, they should consider integration as a Real-Time Data or other module type. 1. Creative rendering scripts must(*) load from the creative frame and not directly in the page. In other words, creative rendering JavaScript cannot be used to bypass the “no external code” rule. 1. Bidder modules must not(*) make requests to endpoints for functionality other than auctions without: 1. Disclosure @@ -83,7 +83,7 @@ The use of the terms "must" and "should" in this document is deliberate. Howeve 1. Building a Real-Time Data sub-module that obtains data in a way that can be utilized by other bidders as well if a bidder would like to incorporate an external data fetch that would influence the auction. 1. Bidder modules must not obtain bid information from or about any other party in the auction. E.g., they cannot listen to ad server events and forward information naming other bidders back to their endpoint - that is the job of an analytics module. 1. Bidder modules must not(*) cache bids from previous auctions. That functionality is reserved for Prebid core. -1. Bidders must(*) accept parameters in the conventional location in preference to bidder-specific parameters. The list of these parameters is in the [bidder adapter documentation](/dev-docs/bidder-adaptor.html#std-param-location). +1. Bidders must accept parameters in the conventional location in preference to bidder-specific parameters. The list of these parameters is in the [bidder adapter documentation](/dev-docs/bidder-adaptor.html#std-param-location). 1. Bidders must not override the standard ad server targeting values: hb_adid, hb_bidder, hb_pb, hb_deal, or hb_size, hb_source, hb_format. 1. If bid adapters are reporting multiple media types in the hb_format as ‘banner’, they must(*) indicate the actual mediatype in the metadata object. One use case for this is that it allows publishers to manage which creatives support safeframes. 1. Bidder modules should supply buyer metadata - including advertiser, advertiser domain, network, actual mediatype, and others defined in the Prebid documentation. From 4aa56af9671805a7dbc1dee00dd7129952c06f9e Mon Sep 17 00:00:00 2001 From: nkloeber <100145701+nkloeber@users.noreply.github.com> Date: Thu, 8 Dec 2022 20:50:16 +0100 Subject: [PATCH 157/280] Yieldlab Bid Adapter update dev docs (#4163) * Yieldlab Bid Adapter update dev docs to reflect that the floors module is supported * Add missing metadata to yieldlab doc Co-authored-by: Mirko Feddern --- dev-docs/bidders/yieldlab.md | 9 +++++++++ 1 file changed, 9 insertions(+) diff --git a/dev-docs/bidders/yieldlab.md b/dev-docs/bidders/yieldlab.md index c24215f353..7ac8369c7b 100644 --- a/dev-docs/bidders/yieldlab.md +++ b/dev-docs/bidders/yieldlab.md @@ -10,6 +10,15 @@ userIds: britepoolId, criteo, id5Id, identityLink, liveIntentId, netId, parrable prebid_member: true pbjs: true pbs: true +pbs_app_supported: true +floors_supported: true +fpd_supported: true +ortb_blocking_supported: false +multiformat_supported: will-bid-on-any +deals_supported: true +gvl_id: 70 +coppa_supported: false +usp_supported: false --- From fafccd6d6e618c2a27950eb8b0c62ef447d59328 Mon Sep 17 00:00:00 2001 From: redtram-tech <84892722+redtram-tech@users.noreply.github.com> Date: Thu, 8 Dec 2022 21:50:52 +0200 Subject: [PATCH 158/280] Add new adapter Redtram (#4162) * Add Redtram Bid * Added metadata --- dev-docs/bidders/redtram.md | 68 +++++++++++++++++++++++++++++++++++++ 1 file changed, 68 insertions(+) create mode 100644 dev-docs/bidders/redtram.md diff --git a/dev-docs/bidders/redtram.md b/dev-docs/bidders/redtram.md new file mode 100644 index 0000000000..2f9266cb48 --- /dev/null +++ b/dev-docs/bidders/redtram.md @@ -0,0 +1,68 @@ +--- +layout: bidder +title: Redtram +description: Prebid Redtram Bidder Adapter. +pbjs: true +pbs: false +gvl_id: none +biddercode: redtram +media_types: banner +gdpr_supported: false +usp_supported: false +coppa_supported: false +schain_supported: false +safeframes_ok: false +dchain_supported: false +deals_supported: false +floors_supported: true +fpd_supported: false +ortb_blocking_supported: false +multiformat_supported: will-bid-on-one +prebid_member: false +--- + +### Table of Contents + +- [Description](#redtram-bid-desc) +- [Bid Params](#redtram-bid-params) +- [Test Params](#redtram-test-params) + + + +### Description + +Redtram header bidding adapter connects with redtram demand sources to fetch bids for display placements. Please reach out to your account manager or for more information. + + + +### Bid params + +{: .table .table-bordered .table-striped } +| Name | Scope | Description | Example | Type | +|--------------|----------|------------------------------------|------------|----------| +| `placementId`| optional | The placement ID from Redtram | `'23611'` | `string` | +| `bidFloor` | optional | Lowest value of expected bid price | `1.1` | `float` | + + + + +### Test Parameters + +300x250 banner test +``` +var adUnits = [{ + code: 'prebid-place', + mediaTypes: { + banner: { + sizes: [[300, 250]] + } + }, + // Replace this object to test a new Adapter! + bids: [{ + bidder: 'redtram', + params : { + placementId : "23611" //test, please replace after test + } + }] +}]; +``` From f0ed44ff5d613871901d2772838c14fb470db554 Mon Sep 17 00:00:00 2001 From: Yohan Boutin Date: Thu, 8 Dec 2022 20:52:12 +0100 Subject: [PATCH 159/280] update doc example for inBanner and inStream examples (#4142) --- dev-docs/bidders/seedtag.md | 61 +++++++++++++++++++++++++++++++++++++ 1 file changed, 61 insertions(+) diff --git a/dev-docs/bidders/seedtag.md b/dev-docs/bidders/seedtag.md index 03d7dffc0b..7326fb048b 100644 --- a/dev-docs/bidders/seedtag.md +++ b/dev-docs/bidders/seedtag.md @@ -6,6 +6,7 @@ pbjs: true gdpr_supported: true usp_supported: true schain_supported: true +safeframes_ok: true gvl_id: 157 media_types: banner, video biddercode: seedtag @@ -81,3 +82,63 @@ const adUnits = [ } ] ``` + +## InBanner example +```js +const adUnits = [ + { + code: '/21804003197/prebid_test_300x250', + mediaTypes: { + banner: { + sizes: [[300, 250]] + } + }, + bids: [ + { + bidder: 'seedtag', + params: { + publisherId: '0000-0000-01', // required + adUnitId: '0000', // required + placement: 'inBanner', // required + } + } + ] + } +] +``` + +## inStream example +```js +var adUnits = [{ + code: 'video', + mediaTypes: { + video: { + context: 'instream', // required + playerSize: [640, 360], // required + // Video object as specified in OpenRTB 2.5 + mimes: ['video/mp4'], // recommended + minduration: 5, // optional + maxduration: 60, // optional + boxingallowed: 1, // optional + skip: 1, // optional + startdelay: 1, // optional + linearity: 1, // optional + battr: [1, 2], // optional + maxbitrate: 10, // optional + playbackmethod: [1], // optional + delivery: [1], // optional + placement: 1, // optional + } + }, + bids: [ + { + bidder: 'seedtag', + params: { + publisherId: '0000-0000-01', // required + adUnitId: '0000', // required + placement: 'inStream', // required + } + } + ] +}]; +``` From 4b75f394a07e034f4131996b031ef70b065a8d6b Mon Sep 17 00:00:00 2001 From: southern-growthcode <79725079+southern-growthcode@users.noreply.github.com> Date: Thu, 8 Dec 2022 14:53:47 -0500 Subject: [PATCH 160/280] Added GrowthCode Analyics to Docs (#4029) --- dev-docs/analytics/growthcode.md | 45 ++++++++++++++++++++++++++++++++ 1 file changed, 45 insertions(+) create mode 100644 dev-docs/analytics/growthcode.md diff --git a/dev-docs/analytics/growthcode.md b/dev-docs/analytics/growthcode.md new file mode 100644 index 0000000000..e391e65280 --- /dev/null +++ b/dev-docs/analytics/growthcode.md @@ -0,0 +1,45 @@ +--- +layout: analytics +title: Growthcode +description: GrowthCode Analytics Adapter +modulecode: growthCodeAnalytics +enable_download: false +--- + +#### Registration + +[GrowthCode](https://growthcode.io) offers scaled infrastructure-as-a-service to +empower independent publishers to harness data and take control of identity and +audience while rapidly aligning to industry changes and margin pressure. + +Please visit [https://growthcode.io/](https://growthcode.io/) for more information. + +#### Analytics Options + +| Param enableAnalytics | Scope | Type | Description | Example | +|-----------------------|----------|--------|---------------------------------------------------------|--------------------------| +| provider | Required | String | The name of this Adapter. | `"growthCodeAnalytics"` | +| params | Required | Object | Details of module params. | | +| params.pid | Required | String | This is the Customer ID value obtained from GrowthCode. | `""` | +| params.url | Optional | String | Custom URL for server | | +| params.trackEvents | Required | String | Name if the variable that holds your publisher ID | | + +#### Example Configuration + +```javascript +pbjs.enableAnalytics({ + provider: 'growthCodeAnalytics', + options: { + pid: '', + trackEvents: [ + 'auctionEnd', + 'bidAdjustment', + 'bidTimeout', + 'bidRequested', + 'bidResponse', + 'noBid', + 'bidWon', + 'bidderDone'] + } +}); +``` From fb3fc4c2169ac456b9a13731233ab93d10966504 Mon Sep 17 00:00:00 2001 From: bretg Date: Fri, 9 Dec 2022 09:40:28 -0500 Subject: [PATCH 161/280] removing rubicon HTTP2 disclosure (#4210) the Magnite DV+ exchange now supports HTTP2 in all regions --- dev-docs/bidders/rubicon.md | 3 --- 1 file changed, 3 deletions(-) diff --git a/dev-docs/bidders/rubicon.md b/dev-docs/bidders/rubicon.md index d38ac3d086..b7ee25885e 100644 --- a/dev-docs/bidders/rubicon.md +++ b/dev-docs/bidders/rubicon.md @@ -21,9 +21,6 @@ ortb_blocking_supported: partial gvl_id: 52 multiformat_supported: will-bid-on-one --- -### Disclosure: - -This adapter is known to use an HTTP 1 endpoint. Header bidding often generates multiple requests to the same host and bidders are encouraged to change to HTTP 2 or above to help improve publisher page performance via multiplexing. ### Registration From bc31ba85d8ed6192e0b293f49b6e3dc43d046369 Mon Sep 17 00:00:00 2001 From: bretg Date: Fri, 9 Dec 2022 15:25:29 -0500 Subject: [PATCH 162/280] Added note about PBSIMPID macro --- prebid-server/endpoints/openrtb2/pbs-endpoint-auction.md | 1 + 1 file changed, 1 insertion(+) diff --git a/prebid-server/endpoints/openrtb2/pbs-endpoint-auction.md b/prebid-server/endpoints/openrtb2/pbs-endpoint-auction.md index c64f316d3c..fbf8c5878d 100644 --- a/prebid-server/endpoints/openrtb2/pbs-endpoint-auction.md +++ b/prebid-server/endpoints/openrtb2/pbs-endpoint-auction.md @@ -960,6 +960,7 @@ Could result in this response: Notes: - the DB entries for this stored-response scenario are quite different: they need to be in whatever format the bid adapter's endpoint responds with. i.e. the host company will need to capture an actual bid response from the specific bidders and enter it into the DB table. - the `replaceimpid` parameter tells PBS to ignore the impid supplied in the DB and instead create/overwrite seatbid.bid.impid with the value that matches the incoming request. This simplifies debugging. +- `replaceimpid` doesn't work in PBS-Java. Instead, the implementation there is to use the `##PBSIMPID##` macro in the body of the stored response, which will be replaced by PBS-core. See Prebid.org troubleshooting pages for how to utilize this feature within the context of the browser. From b188206875bf8b9dd3eb8b63443b4ea984c8bfb0 Mon Sep 17 00:00:00 2001 From: Jean Stemp <38964447+jeanstemp@users.noreply.github.com> Date: Fri, 9 Dec 2022 13:51:41 -0800 Subject: [PATCH 163/280] Replace old gpt domain (#4209) Co-authored-by: Jean Stemp --- dev-docs/bidders/afp.md | 2 +- dev-docs/bidders/astraone.md | 2 +- dev-docs/bidders/hybrid.md | 2 +- dev-docs/modules/dfp_express.md | 2 +- examples/video/outstream/pb-ve-outstream-dfp.html | 2 +- examples/video/pb-video-template.html | 2 +- 6 files changed, 6 insertions(+), 6 deletions(-) diff --git a/dev-docs/bidders/afp.md b/dev-docs/bidders/afp.md index 07e3d197ea..f00175894a 100644 --- a/dev-docs/bidders/afp.md +++ b/dev-docs/bidders/afp.md @@ -126,7 +126,7 @@ The code below returns a demo ad. Prebid.js In-image Example - + - +