@maccesar/titools 5.1.1 → 5.2.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CONTRIBUTING.md +69 -0
- package/README.md +112 -72
- package/agents/ti-pro.md +5 -1
- package/commands/ti-audit.md +5 -1
- package/docs/examples.md +91 -0
- package/docs/knowledge-index.md +57 -0
- package/lib/config.js +2 -0
- package/lib/downloader.js +1 -1
- package/package.json +4 -2
- package/skills/purgetss/references/multi-density-images.md +1 -1
- package/skills/ti-admob-unified/SKILL.md +58 -0
- package/skills/ti-admob-unified/agents/openai.yaml +4 -0
- package/skills/ti-admob-unified/assets/example/app.js +1207 -0
- package/skills/ti-admob-unified/assets/example/lib/ads.js +646 -0
- package/skills/ti-admob-unified/assets/example/library-usage.js +136 -0
- package/skills/ti-admob-unified/references/api-reference.md +615 -0
- package/skills/ti-admob-unified/references/banners.md +435 -0
- package/skills/ti-admob-unified/references/contributing.md +233 -0
- package/skills/ti-admob-unified/references/dependencies.md +91 -0
- package/skills/ti-admob-unified/references/fullscreen.md +238 -0
- package/skills/ti-admob-unified/references/game-monetization.md +148 -0
- package/skills/ti-admob-unified/references/getting-started.md +319 -0
- package/skills/ti-admob-unified/references/index.md +33 -0
- package/skills/ti-admob-unified/references/integration.md +87 -0
- package/skills/ti-admob-unified/references/library.md +220 -0
- package/skills/ti-admob-unified/references/mediation-parity.md +17 -0
- package/skills/ti-admob-unified/references/mediation.md +145 -0
- package/skills/ti-admob-unified/references/migration.md +259 -0
- package/skills/ti-admob-unified/references/module-changelog.md +84 -0
- package/skills/ti-admob-unified/references/module-license.txt +21 -0
- package/skills/ti-admob-unified/references/privacy.md +281 -0
- package/skills/ti-admob-unified/references/production.md +67 -0
- package/skills/ti-admob-unified/references/rewarded-interstitial.md +101 -0
- package/skills/ti-admob-unified/references/roadmap.md +143 -0
- package/skills/ti-admob-unified/references/source-notes.md +80 -0
- package/skills/ti-admob-unified/references/source-snapshot.json +644 -0
- package/skills/ti-admob-unified/references/third-party-notices.md +22 -0
- package/skills/ti-game/SKILL.md +31 -5
- package/skills/ti-game/references/api.md +36 -24
- package/skills/ti-game/references/debugging-performance.md +22 -7
- package/skills/ti-game/references/examples.md +113 -20
- package/skills/ti-game/references/input.md +101 -0
- package/skills/ti-game/references/patterns.md +56 -10
- package/skills/ti-game/references/physics.md +530 -0
- package/skills/ti-game/references/project-setup.md +131 -47
- package/skills/ti-game/references/recipes-action.md +149 -18
- package/skills/ti-game/references/recipes-adventure-effects.md +47 -4
- package/skills/ti-game/references/roadmap.md +11 -4
- package/skills/ti-game/references/source-notes.md +81 -0
- package/skills/ti-game/references/tilemaps.md +13 -4
- package/skills/ti-game-assets/SKILL.md +53 -0
- package/skills/ti-game-assets/agents/openai.yaml +4 -0
- package/skills/ti-game-assets/references/alpha.md +26 -0
- package/skills/ti-game-assets/references/art-direction.md +37 -0
- package/skills/ti-game-assets/references/integration.md +49 -0
- package/skills/ti-game-assets/references/manifest.example.json +429 -0
- package/skills/ti-game-assets/references/manifest.md +39 -0
- package/skills/ti-game-assets/references/offline-audio.md +33 -0
- package/skills/ti-game-assets/references/prompts.md +33 -0
- package/skills/ti-game-assets/references/repeating-textures.md +17 -0
- package/skills/ti-game-assets/references/responsible-ads.md +31 -0
- package/skills/ti-game-assets/references/sound-assets.md +42 -0
- package/skills/ti-game-assets/references/vector-sources.md +21 -0
- package/skills/ti-game-assets/scripts/alpha_tools.py +160 -0
- package/skills/ti-game-assets/scripts/requirements.txt +1 -0
- package/skills/ti-game-assets/scripts/validate_manifest.py +267 -0
- package/skills/ti-synthengine/SKILL.md +77 -67
- package/skills/ti-synthengine/assets/example/README.md +84 -0
- package/skills/ti-synthengine/assets/example/app.js +1178 -0
- package/skills/ti-synthengine/assets/example/lib/sequenceOwner.js +83 -0
- package/skills/ti-synthengine/assets/example/lib/sequenceScore.js +25 -0
- package/skills/ti-synthengine/references/advanced-examples.md +174 -0
- package/skills/ti-synthengine/references/android-sim80-correction-evidence.zip +0 -0
- package/skills/ti-synthengine/references/android-sim80-correction.json +162 -0
- package/skills/ti-synthengine/references/api.md +573 -153
- package/skills/ti-synthengine/references/audio-engine.md +272 -124
- package/skills/ti-synthengine/references/bypass-physical-recheck-evidence.zip +0 -0
- package/skills/ti-synthengine/references/examples.md +355 -106
- package/skills/ti-synthengine/references/frontier-android-evidence.zip +0 -0
- package/skills/ti-synthengine/references/frontier-ipad-evidence.zip +0 -0
- package/skills/ti-synthengine/references/frontier-physical-validation.json +1918 -0
- package/skills/ti-synthengine/references/guide.md +426 -75
- package/skills/ti-synthengine/references/performance-review-evidence.zip +0 -0
- package/skills/ti-synthengine/references/performance-review.json +1146 -0
- package/skills/ti-synthengine/references/physical-validation.json +1457 -0
- package/skills/ti-synthengine/references/recipes-interaction.md +549 -0
- package/skills/ti-synthengine/references/recipes.md +434 -420
- package/skills/ti-synthengine/references/recommendations.md +72 -85
- package/skills/ti-synthengine/references/sound-design.md +375 -155
- package/skills/ti-synthengine/references/source-notes.md +109 -0
- package/skills/ti-synthengine/references/source-snapshot.json +452 -0
- package/skills/ti-synthengine/references/stats-performance.json +2992 -0
- package/skills/ti-synthengine/references/stats-performance.md +82 -0
- package/skills/ti-synthengine/references/studio-validation.json +6202 -0
- package/skills/ti-synthengine/references/troubleshooting.md +123 -78
- package/skills/ti-synthengine/references/unified-bypass-performance.json +22425 -0
- package/skills/ti-synthengine/references/unified-validation.json +314 -0
- package/AGENTS-VERCEL-RESEARCH.md +0 -175
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
> Source snapshot: official ti.admob.unified 1.0.0 documentation at release source commit `034843299b2984253988e0ffccb9f6a1c91682c9` (copied 2026-10-24). Relative links rebased for this skill.
|
|
2
|
+
|
|
3
|
+
# Mediation parity
|
|
4
|
+
|
|
5
|
+
The first release, `1.0.0`, provides five optional dependency modules with identical identifiers on iOS and Android. Install only the networks the application intends to use. The core `ti.admob.unified` contains Google Mobile Ads and UMP only. The complements provide dependencies without a JavaScript API or manual provider initialization.
|
|
6
|
+
|
|
7
|
+
| Network | Module ID | iOS adapter | Android adapter |
|
|
8
|
+
| ------------------------- | ------------------------------------- | ------------ | --------------- |
|
|
9
|
+
| AppLovin | `ti.admob.unified.mediation.applovin` | `13.6.4.0` | `13.6.4.2` |
|
|
10
|
+
| Meta Audience Network | `ti.admob.unified.mediation.meta` | `6.22.0.0` | `6.22.0.1` |
|
|
11
|
+
| InMobi | `ti.admob.unified.mediation.inmobi` | `11.5.0.0` | `11.5.0.1` |
|
|
12
|
+
| Unity Ads | `ti.admob.unified.mediation.unity` | `4.21.0.0` | `4.21.0.0` |
|
|
13
|
+
| Liftoff Monetize (Vungle) | `ti.admob.unified.mediation.liftoff` | `7.7.8.0` | `7.7.9.0` |
|
|
14
|
+
|
|
15
|
+
ironSource mediation is deferred: neither its adapter nor its advertising SDK is distributed. Unity includes UnityCoherenceLib; Unity Ads 4.21.0 no longer requires IronSourceAdQualitySDK.
|
|
16
|
+
|
|
17
|
+
All requests use the core factories and event contracts. Network selection requires installing the corresponding complement and configuring the source in AdMob. `getMediationStatus()` reports `{ initializationState, adapters }` with all statuses known to Google on both platforms. Entries include native class name, state, description and latency in milliseconds. Initialization and ad delivery require separate verification. See [AdMob mediation](mediation.md).
|
|
@@ -0,0 +1,145 @@
|
|
|
1
|
+
> Source snapshot: official ti.admob.unified 1.0.0 documentation at release source commit `034843299b2984253988e0ffccb9f6a1c91682c9` (copied 2026-10-24). Relative links rebased for this skill.
|
|
2
|
+
|
|
3
|
+
# AdMob mediation
|
|
4
|
+
|
|
5
|
+
The first release, `1.0.0`, provides five optional dependency modules with identical identifiers on iOS and Android. Install only the networks the application intends to use. The core `ti.admob.unified` contains Google Mobile Ads and UMP only. Each complement has no JavaScript API and performs no manual provider initialization.
|
|
6
|
+
|
|
7
|
+
| Network | Module ID | iOS adapter | Android adapter |
|
|
8
|
+
| ------------------------- | ------------------------------------- | ----------- | --------------- |
|
|
9
|
+
| AppLovin | `ti.admob.unified.mediation.applovin` | `13.6.4.0` | `13.6.4.2` |
|
|
10
|
+
| Meta Audience Network | `ti.admob.unified.mediation.meta` | `6.22.0.0` | `6.22.0.1` |
|
|
11
|
+
| InMobi | `ti.admob.unified.mediation.inmobi` | `11.5.0.0` | `11.5.0.1` |
|
|
12
|
+
| Unity Ads | `ti.admob.unified.mediation.unity` | `4.21.0.0` | `4.21.0.0` |
|
|
13
|
+
| Liftoff Monetize (Vungle) | `ti.admob.unified.mediation.liftoff` | `7.7.8.0` | `7.7.9.0` |
|
|
14
|
+
|
|
15
|
+
ironSource mediation is deferred: neither its adapter nor its advertising SDK is distributed. Unity includes UnityCoherenceLib. Unity Ads 4.21.0 no longer depends on IronSourceAdQualitySDK, so it is not distributed.
|
|
16
|
+
|
|
17
|
+
## Installing one or several networks
|
|
18
|
+
|
|
19
|
+
Install the core ZIP and each selected complement ZIP for every target platform. One declaration covers both platforms:
|
|
20
|
+
|
|
21
|
+
```xml
|
|
22
|
+
<modules>
|
|
23
|
+
<module version="1.0.0">ti.admob.unified</module>
|
|
24
|
+
<module version="1.0.0">ti.admob.unified.mediation.applovin</module>
|
|
25
|
+
</modules>
|
|
26
|
+
```
|
|
27
|
+
|
|
28
|
+
For AppLovin and Unity together:
|
|
29
|
+
|
|
30
|
+
```xml
|
|
31
|
+
<modules>
|
|
32
|
+
<module version="1.0.0">ti.admob.unified</module>
|
|
33
|
+
<module version="1.0.0">ti.admob.unified.mediation.applovin</module>
|
|
34
|
+
<module version="1.0.0">ti.admob.unified.mediation.unity</module>
|
|
35
|
+
</modules>
|
|
36
|
+
```
|
|
37
|
+
|
|
38
|
+
Use `1.0.0` for the core and complements. Call only `require('ti.admob.unified')` and its factories. To remove a network, remove its declaration and rebuild.
|
|
39
|
+
|
|
40
|
+
## Installing an adapter is not the same as enabling a network
|
|
41
|
+
|
|
42
|
+
Installing an adapter adds its SDK to the application and makes it discoverable by Google Mobile Ads. It does not approve a publisher account, configure a mediation group or validate credentials. Leave unneeded complements out of the build. Their exact frameworks, dependencies and versions are recorded in [Dependencies](dependencies.md).
|
|
43
|
+
|
|
44
|
+
## Publisher setup
|
|
45
|
+
|
|
46
|
+
For each network that an application will use:
|
|
47
|
+
|
|
48
|
+
1. Create or connect the publisher account for that network.
|
|
49
|
+
2. Add the network as an ad source in the AdMob mediation group.
|
|
50
|
+
3. Enter the provider credentials and map the provider placement to the AdMob ad unit.
|
|
51
|
+
4. Complete the provider's privacy and store-disclosure requirements.
|
|
52
|
+
5. Validate the integration with test ads and Ad Inspector before enabling production traffic.
|
|
53
|
+
|
|
54
|
+
Google Mobile Ads can still inspect or initialize every installed adapter during SDK startup. In development, incomplete or conflicting server mappings can produce provider warnings even when Google serves the requested test banner. Examples include a missing AppLovin SDK key and multiple Liftoff Monetize app IDs. The module does not add provider credentials to either native manifest; AdMob supplies those server parameters from the mediation mapping.
|
|
55
|
+
|
|
56
|
+
Do not silence these messages with placeholder credentials. Complete the provider mapping, use that provider's test mode, and verify it through single-source testing in Ad Inspector. If the application does not intend to use a network, leave it out of the AdMob mediation group.
|
|
57
|
+
|
|
58
|
+
Google maintains the current setup instructions and format caveats in its [Android mediation network guide](https://developers.google.com/admob/android/choose-networks) and [iOS mediation network guide](https://developers.google.com/admob/ios/choose-networks). Use formats supported by the selected network and adapter version.
|
|
59
|
+
|
|
60
|
+
Use the provider-specific instructions for account mapping, privacy, SKAdNetwork IDs and test mode. Their current sample dependency versions may be newer than the versions packaged here; use [Dependencies](dependencies.md) for this release's inventory.
|
|
61
|
+
|
|
62
|
+
| Provider | Android setup | iOS setup |
|
|
63
|
+
| --- | --- | --- |
|
|
64
|
+
| AppLovin | [Guide](https://developers.google.com/admob/android/mediation/applovin) | [Guide](https://developers.google.com/admob/ios/mediation/applovin) |
|
|
65
|
+
| Meta | [Guide](https://developers.google.com/admob/android/mediation/meta) | [Guide](https://developers.google.com/admob/ios/mediation/meta) |
|
|
66
|
+
| InMobi | [Guide](https://developers.google.com/admob/android/mediation/inmobi) | [Guide](https://developers.google.com/admob/ios/mediation/inmobi) |
|
|
67
|
+
| Unity | [Guide](https://developers.google.com/admob/android/mediation/unity) | [Guide](https://developers.google.com/admob/ios/mediation/unity) |
|
|
68
|
+
| Liftoff | [Guide](https://developers.google.com/admob/android/mediation/liftoff-monetize) | [Guide](https://developers.google.com/admob/ios/mediation/liftoff-monetize) |
|
|
69
|
+
|
|
70
|
+
|
|
71
|
+
## Missing configuration and startup errors
|
|
72
|
+
|
|
73
|
+
Only install selected complements when the app will use mediation and its publisher accounts, source mappings and credentials are configured. The examples and the core-only test app do not require these accounts. Do not install the complements merely to run Google demo ads.
|
|
74
|
+
|
|
75
|
+
An internal Android demo build with several adapters produced these messages. Each points to a different failure; only some identify missing credentials:
|
|
76
|
+
|
|
77
|
+
| Message | What it establishes | Action |
|
|
78
|
+
| --------------------------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------ | -------------------------------------------------------------------------------------------------------------------------------------------------------- |
|
|
79
|
+
| AppLovin: `Missing or invalid SDK Key.` | The adapter did not receive a usable SDK key. | Verify the publisher SDK key and the AppLovin mapping in AdMob. |
|
|
80
|
+
| AdColony: `Failed to create Adapter.` | Google could not construct the requested adapter. This does not establish a missing key. AdColony is not one of the five distributed adapters. | Inspect the requested ad source/mapping and adapter availability in Ad Inspector. Do not add a legacy SDK or placeholder credentials just to silence it. |
|
|
81
|
+
| Liftoff/Vungle: `Timeout.` | Initialization did not finish before the SDK timeout. In the observed run, a preceding warning reported conflicting app IDs and selection of `fake-vungle-app-id`. | Check the provider app ID and AdMob mapping; the timeout alone does not prove which configuration value is wrong. |
|
|
82
|
+
|
|
83
|
+
### Why there is no automatic “missing local key → skip this network” filter
|
|
84
|
+
|
|
85
|
+
Android runs Google request configuration and startup on a worker thread. Waiting for the completion event can still take up to the SDK timeout when a selected provider does not finish. Keep application navigation usable during this wait.
|
|
86
|
+
|
|
87
|
+
Each optional module packages dependencies. Google calls the provider initializers. Google Mobile Ads controls adapter initialization and supplies mediation parameters from AdMob. There is no supported pre-initialization API in the Google Mobile Ads APIs used here that lets this module read all publisher mappings and selectively suppress adapters with missing credentials.
|
|
88
|
+
|
|
89
|
+
A key may be absent from JavaScript or the native manifest and still be configured in AdMob. The [AppLovin adapter guide](https://developers.google.com/admob/android/mediation/applovin) instructs publishers to enter the SDK key in AdMob; its changelog says adapter 12.1.0.0 stopped checking the Android manifest. Google handles readiness checks and provider initialization through its public SDK APIs.
|
|
90
|
+
|
|
91
|
+
Choose the setup that matches the application:
|
|
92
|
+
|
|
93
|
+
- For Google ads alone, omit complements and call `Admob.initialize({})`. There are no third-party adapters to initialize.
|
|
94
|
+
- For mediation, include one `tiapp.xml` entry per selected network, configure its account and AdMob mappings, and call `Admob.initialize({})`. Google discovers the installed adapters without an `enableMediation` flag or manual provider initializer. Check native initialization results and Ad Inspector; `getMediationStatus()` reports the adapter initialization states known to Google.
|
|
95
|
+
|
|
96
|
+
For a session that deliberately skips initialization of installed adapters, see the [initialization reference](api-reference.md#automatic-adapter-discovery). That exception is global and does not validate credentials or filter individual networks.
|
|
97
|
+
|
|
98
|
+
## Portable diagnostics
|
|
99
|
+
|
|
100
|
+
`getMediationStatus()` belongs to the core and returns `{ initializationState, adapters }`. It includes every adapter Google reports, including Google, sorted by native class name. Entries contain `adapterClass`, `state`, `description` and numeric `latencyMs`; native class names may differ across platforms.
|
|
101
|
+
|
|
102
|
+
```js
|
|
103
|
+
const Admob = require('ti.admob.unified')
|
|
104
|
+
Admob.addEventListener('module_initialized', event => {
|
|
105
|
+
const diagnostic = Admob.getMediationStatus()
|
|
106
|
+
Ti.API.info(diagnostic.initializationState)
|
|
107
|
+
diagnostic.adapters.forEach(adapter => {
|
|
108
|
+
Ti.API.info(`${adapter.adapterClass}: ${adapter.state} (${adapter.latencyMs} ms) ${adapter.description}`)
|
|
109
|
+
})
|
|
110
|
+
})
|
|
111
|
+
```
|
|
112
|
+
|
|
113
|
+
Before `initialize()`, the result is `not_started` with no adapters. During startup it is `initializing` and Google's map may be partial or empty. `completed` means the core callback finished, even when an adapter is `not_ready`; an initialization exception reports `failed`. The query does not initialize SDKs or request ads. Neither absence from this map nor `ready` establishes installed-module inventory, valid accounts, credentials or ad delivery. See the [complete contract](api-reference.md#mediation-diagnostics).
|
|
114
|
+
|
|
115
|
+
New providers need no core registration. Follow [Adding a network](contributing.md#adding-a-network) to package an existing official adapter.
|
|
116
|
+
|
|
117
|
+
After initialization on a registered test device, inspect actual requests:
|
|
118
|
+
|
|
119
|
+
```js
|
|
120
|
+
Admob.addEventListener('ad_inspector_closed', event => {
|
|
121
|
+
Ti.API.info(JSON.stringify(event))
|
|
122
|
+
})
|
|
123
|
+
Admob.openAdInspector()
|
|
124
|
+
```
|
|
125
|
+
|
|
126
|
+
## Privacy and bundled resources
|
|
127
|
+
|
|
128
|
+
Continue using UMP and `canRequestAds()` before requests. Each selected iOS complement includes its vendor resources and privacy manifests. Review the current Google/provider guidance for SKAdNetwork entries, privacy disclosures and consent propagation for the networks the application distributes. Android resolves the Maven dependencies declared by each selected complement, including the explicitly declared Unity SDK.
|
|
129
|
+
|
|
130
|
+
The public example and the test demo use only the core, with no mediation flag. No provider credentials are required to run Google demo ads. Adding a selected complement to `tiapp.xml` makes its adapter discoverable at SDK startup; configure the provider account and AdMob mapping before using that network. Automatic discovery does not validate credentials or eliminate initialization timeouts.
|
|
131
|
+
|
|
132
|
+
## Release validation
|
|
133
|
+
|
|
134
|
+
Build all discovered modules (two ZIPs per module) and inspect their framework inventories and generated POMs. Compile isolated consumer applications on both platforms with core only, each of the five complements individually, AppLovin + Unity, and all five together. Check that no framework is duplicated and that resolved dependency versions remain pinned.
|
|
135
|
+
|
|
136
|
+
Record separately:
|
|
137
|
+
|
|
138
|
+
- Integration and linking: the build succeeds, expected adapter classes are visible, and official Google test ads load.
|
|
139
|
+
- Provider ad delivery: the provider returns its own test ad with valid publisher accounts and AdMob mappings, confirmed by single-source testing in Ad Inspector.
|
|
140
|
+
|
|
141
|
+
Google test ads do not prove provider delivery. iOS simulator results do not substitute for device results. Re-run device validation when hardware is available. Do not use or click production ads during development.
|
|
142
|
+
|
|
143
|
+
## Unity consent with the pinned adapter
|
|
144
|
+
|
|
145
|
+
The distribution uses Unity adapter `4.21.0.0` on both platforms. It includes the automatic forwarding of `IABTCF_AddtlConsent` introduced in `4.19.0.1` on [Android](https://developers.google.com/admob/android/mediation/unity) and [iOS](https://developers.google.com/admob/ios/mediation/unity). Configure Unity as a consent partner and verify signal propagation with the provider before enabling demand. Adapter presence and a Google test ad do not establish provider consent or delivery.
|
|
@@ -0,0 +1,259 @@
|
|
|
1
|
+
> Source snapshot: official ti.admob.unified 1.0.0 documentation at release source commit `034843299b2984253988e0ffccb9f6a1c91682c9` (copied 2026-10-24). Relative links rebased for this skill.
|
|
2
|
+
|
|
3
|
+
# Migrating to ti.admob.unified
|
|
4
|
+
|
|
5
|
+
This guide covers adopting the first release, `1.0.0`, from a platform-specific AdMob module or an internal development build. There are no previously published versions of this module.
|
|
6
|
+
|
|
7
|
+
## Selecting mediation dependencies
|
|
8
|
+
|
|
9
|
+
Install only the core for Google ads. If the application mediates, install a complement for each selected network. For example:
|
|
10
|
+
|
|
11
|
+
```xml
|
|
12
|
+
<modules>
|
|
13
|
+
<module version="1.0.0">ti.admob.unified</module>
|
|
14
|
+
<module version="1.0.0">ti.admob.unified.mediation.applovin</module>
|
|
15
|
+
</modules>
|
|
16
|
+
```
|
|
17
|
+
|
|
18
|
+
The aggregate development package is not part of this release. Replace its declaration with the desired per-network modules. `getMediationStatus()` now reports Google initialization states through `{ initializationState, adapters }`; it does not validate mappings or delivery. ironSource mediation is deferred. See [AdMob mediation](mediation.md).
|
|
19
|
+
|
|
20
|
+
## If you used an internal pre-release build
|
|
21
|
+
|
|
22
|
+
Internal ZIPs exposed API differences that never reached a published release. Update code that depends on them as follows.
|
|
23
|
+
|
|
24
|
+
### Generic mediation diagnostics
|
|
25
|
+
|
|
26
|
+
Replace reads of the old six-Boolean map (for example `status.appLovin`) with iteration over `Admob.getMediationStatus().adapters` after `module_initialized`. Use `initializationState` for the core process and each entry's `state` for Google's adapter report. There is no portable provider-key mapping: native class names differ between iOS and Android. Before startup the array is empty; during startup it may be partial. A `ready` entry does not prove account configuration or ad delivery.
|
|
27
|
+
|
|
28
|
+
Remove calls to `isAppLovinAvailable`, `isMetaAvailable`, `isInMobiAvailable`, `isVungleAvailable`, `isUnityAvailable`, `isIronSourceAvailable` and `enableOptionalMediationNetworks`. Also remove `setAppLovinGDPRConsent`, `setInMobiGDPRConsent` and `setVungleGDPRConsent`; those pre-release setters only logged warnings. Continue using UMP and each provider's documented consent requirements. `disableMediation` and the `module_initialized` payload are unchanged.
|
|
29
|
+
|
|
30
|
+
### There is no `COLLAPSIBLE_TOP` or `COLLAPSIBLE_BOTTOM`
|
|
31
|
+
|
|
32
|
+
Neither constant is exported. Reading it returns `undefined`; passing `Admob.COLLAPSIBLE_TOP` therefore sends `undefined` to the native layer.
|
|
33
|
+
|
|
34
|
+
They used to hold `"collapsible_top"` and `"collapsible_bottom"`. Google's SDK accepts only `"top"` and `"bottom"`, and the module forwarded the value unchanged, so every request built from those constants was invalid.
|
|
35
|
+
|
|
36
|
+
The `collapsible` property itself is unchanged and now works on both platforms. It takes Google's native string:
|
|
37
|
+
|
|
38
|
+
```js
|
|
39
|
+
const banner = Admob.createAdaptiveBanner({
|
|
40
|
+
adUnitId: Admob.TEST_ADAPTIVE_BANNER,
|
|
41
|
+
collapsible: 'bottom'
|
|
42
|
+
})
|
|
43
|
+
```
|
|
44
|
+
|
|
45
|
+
### `smart_banner` no longer produces a full-width banner on iOS
|
|
46
|
+
|
|
47
|
+
Google removed the size on Android and deprecated it on iOS. Internal builds selected a fixed 320×50 banner on Android and a full-width strip on iOS. The value now falls back to `BANNER` on both platforms, like any other unrecognised size.
|
|
48
|
+
|
|
49
|
+
Android behaviour is unaffected. On iOS, a placement that relied on `adSize: 'smart_banner'` for a full-width strip now renders a 320×50 banner.
|
|
50
|
+
|
|
51
|
+
The replacement is `customAdSize`, which both platforms accept:
|
|
52
|
+
|
|
53
|
+
```js
|
|
54
|
+
function screenWidthInDp() {
|
|
55
|
+
const caps = Ti.Platform.displayCaps
|
|
56
|
+
|
|
57
|
+
if (Ti.Platform.osname === 'android') {
|
|
58
|
+
return Math.round(caps.platformWidth / caps.logicalDensityFactor)
|
|
59
|
+
}
|
|
60
|
+
|
|
61
|
+
return Math.round(caps.platformWidth)
|
|
62
|
+
}
|
|
63
|
+
|
|
64
|
+
const banner = Admob.createBanner({
|
|
65
|
+
adUnitId: Admob.TEST_BANNER,
|
|
66
|
+
customAdSize: { width: screenWidthInDp(), height: 50 },
|
|
67
|
+
width: Ti.UI.FILL
|
|
68
|
+
})
|
|
69
|
+
```
|
|
70
|
+
|
|
71
|
+
`createAdaptiveBanner()` is the other option when Google should choose the height. See [Standard banner properties](banners.md#creation-properties-1).
|
|
72
|
+
|
|
73
|
+
### Legacy privacy methods no longer gate ads
|
|
74
|
+
|
|
75
|
+
`canShowPersonalizedAds()` always returns `false` and `canShowAds()` is an alias of `canRequestAds()`. Code that branched on either one has to move to the single gate described below.
|
|
76
|
+
|
|
77
|
+
## Module declaration
|
|
78
|
+
|
|
79
|
+
Replace platform-specific or older AdMob modules with one declaration:
|
|
80
|
+
|
|
81
|
+
```xml
|
|
82
|
+
<modules>
|
|
83
|
+
<module version="1.0.0">ti.admob.unified</module>
|
|
84
|
+
</modules>
|
|
85
|
+
```
|
|
86
|
+
|
|
87
|
+
Add the selected network complements only if the application mediates; for example, `<module version="1.0.0">ti.admob.unified.mediation.applovin</module>` for AppLovin.
|
|
88
|
+
|
|
89
|
+
Update JavaScript imports:
|
|
90
|
+
|
|
91
|
+
```js
|
|
92
|
+
const Admob = require('ti.admob.unified')
|
|
93
|
+
```
|
|
94
|
+
|
|
95
|
+
Install both local artifacts when the app targets iOS and Android.
|
|
96
|
+
|
|
97
|
+
## Move the application ID to `tiapp.xml`
|
|
98
|
+
|
|
99
|
+
Remove `applicationId` from JavaScript initialization. Configure `GADApplicationIdentifier` on iOS and `com.google.android.gms.ads.APPLICATION_ID` on Android as described in [Getting started](getting-started.md).
|
|
100
|
+
|
|
101
|
+
## Replace privacy gates
|
|
102
|
+
|
|
103
|
+
Before:
|
|
104
|
+
|
|
105
|
+
```js
|
|
106
|
+
if (Admob.canShowPersonalizedAds() || !Admob.isGDPR()) {
|
|
107
|
+
loadAds()
|
|
108
|
+
}
|
|
109
|
+
```
|
|
110
|
+
|
|
111
|
+
After:
|
|
112
|
+
|
|
113
|
+
```js
|
|
114
|
+
if (Admob.canRequestAds()) {
|
|
115
|
+
loadAds()
|
|
116
|
+
}
|
|
117
|
+
```
|
|
118
|
+
|
|
119
|
+
Do not consume:
|
|
120
|
+
|
|
121
|
+
- `canShowPersonalizedAds()`
|
|
122
|
+
- `isGDPR()`
|
|
123
|
+
- `canShowAds()`
|
|
124
|
+
- `consent_ready`
|
|
125
|
+
- `consent_error`
|
|
126
|
+
- legacy payload aliases such as `isPrivacyOptionsRequired`
|
|
127
|
+
|
|
128
|
+
Use `consent_complete`, `canRequestAds`, and `privacyOptionsRequired`.
|
|
129
|
+
|
|
130
|
+
## Replace callback-style consent code
|
|
131
|
+
|
|
132
|
+
The supported contract is event-based:
|
|
133
|
+
|
|
134
|
+
```js
|
|
135
|
+
Admob.addEventListener('consent_complete', onConsentComplete)
|
|
136
|
+
Admob.requestConsent({})
|
|
137
|
+
```
|
|
138
|
+
|
|
139
|
+
Callback properties passed inside the config object are not invoked.
|
|
140
|
+
|
|
141
|
+
## Request UMP before initialization
|
|
142
|
+
|
|
143
|
+
The recommended order is:
|
|
144
|
+
|
|
145
|
+
```text
|
|
146
|
+
UMP -> canRequestAds -> initialize -> load ads
|
|
147
|
+
```
|
|
148
|
+
|
|
149
|
+
Use that same sequence on both platforms. Do not initialize before UMP has updated the current session.
|
|
150
|
+
|
|
151
|
+
App Tracking Transparency is optional and sits outside this sequence. If your application has its own tracking case, resolve it before `initialize()`; it is not an ad-request gate, and `canRequestAds()` remains the only one. The call is portable: iOS resolves ATT, and Android emits `tracking_authorization_completed` immediately with `applicable: false`.
|
|
152
|
+
|
|
153
|
+
## Adopt adaptive banner sizing
|
|
154
|
+
|
|
155
|
+
Replace fixed full-width or smart-banner assumptions:
|
|
156
|
+
|
|
157
|
+
```js
|
|
158
|
+
const banner = Admob.createAdaptiveBanner({
|
|
159
|
+
adUnitId: Admob.TEST_ADAPTIVE_BANNER,
|
|
160
|
+
adaptiveType: Admob.ADAPTIVE_ANCHORED,
|
|
161
|
+
width: Ti.UI.FILL
|
|
162
|
+
})
|
|
163
|
+
```
|
|
164
|
+
|
|
165
|
+
On `loaded`, use `event.height` with `event.heightUnit`. Update both the banner host and the adjacent content inset. Collapse both on error and destruction.
|
|
166
|
+
|
|
167
|
+
Do not keep a fixed `50`, `90`, or device-specific height.
|
|
168
|
+
|
|
169
|
+
`ADAPTIVE_INLINE` and `maxHeight` work on iOS too. An application that branched on `Ti.Platform.osname` to keep inline banners off iOS can drop the branch.
|
|
170
|
+
|
|
171
|
+
## Adopt the banner lifecycle
|
|
172
|
+
|
|
173
|
+
Both standard and adaptive banners support:
|
|
174
|
+
|
|
175
|
+
```js
|
|
176
|
+
banner.load()
|
|
177
|
+
banner.pause()
|
|
178
|
+
banner.resume()
|
|
179
|
+
banner.isLoaded()
|
|
180
|
+
banner.destroy()
|
|
181
|
+
```
|
|
182
|
+
|
|
183
|
+
`destroy()` is terminal and idempotent. Remove JavaScript event listeners and the proxy from its parent when the owning placement closes.
|
|
184
|
+
|
|
185
|
+
The module pauses banners when the Android activity pauses or the iOS application enters the background. Remove any application code that duplicates those handlers. Keep calls for navigation changes the module cannot observe, such as hiding a tab or covering a window. See [Who pauses a banner](banners.md#who-pauses-a-banner).
|
|
186
|
+
|
|
187
|
+
Do not carry forward code that changes `visible`, opacity, height, or the banner host during pause/resume. TiAdMobUnified preserves the same visual slot and creative; navigation owns only the application pause cause.
|
|
188
|
+
|
|
189
|
+
Replace both historical aliases when practical:
|
|
190
|
+
|
|
191
|
+
```js
|
|
192
|
+
banner.destroyAdViewAndCancelRequest()
|
|
193
|
+
banner.destoyAdViewAndCancelRequest()
|
|
194
|
+
```
|
|
195
|
+
|
|
196
|
+
with:
|
|
197
|
+
|
|
198
|
+
```js
|
|
199
|
+
banner.destroy()
|
|
200
|
+
```
|
|
201
|
+
|
|
202
|
+
## Remove manual refresh timers
|
|
203
|
+
|
|
204
|
+
Delete `setTimeout`/`setInterval` banner renewal loops. Configure refresh in AdMob and let the native SDK own it.
|
|
205
|
+
|
|
206
|
+
The application issues the initial `load()`. Google Mobile Ads manages later refresh requests; TiAdMobUnified manages lifecycle.
|
|
207
|
+
|
|
208
|
+
## Adopt the fullscreen lifecycle
|
|
209
|
+
|
|
210
|
+
Interstitial, rewarded, rewarded interstitial, and app open proxies share the same methods and event payloads on iOS and Android:
|
|
211
|
+
|
|
212
|
+
```js
|
|
213
|
+
fullscreen.load()
|
|
214
|
+
fullscreen.show()
|
|
215
|
+
fullscreen.isLoaded()
|
|
216
|
+
fullscreen.destroy()
|
|
217
|
+
```
|
|
218
|
+
|
|
219
|
+
Calls to `load()` while a request, loaded ad, or presentation is active are ignored. Each native fullscreen ad is single-use. `destroy()` is terminal and idempotent, and emits `destroyed` once.
|
|
220
|
+
|
|
221
|
+
Common events include `adUnitId` and `adType`; failures add `error`, `message`, and `code`. Both platforms emit `opened` and `showed_fullscreen_content`. Rewarded value must be granted only from the `rewarded` event.
|
|
222
|
+
|
|
223
|
+
### App open
|
|
224
|
+
|
|
225
|
+
`createAppOpen()` returns a dedicated proxy on both platforms. Use this shared factory and the fullscreen lifecycle for app open placements.
|
|
226
|
+
|
|
227
|
+
It follows the fullscreen contract above, with one addition: an app open ad expires four hours after loading completes. Past that point `isLoaded()` reports `false` and `show()` emits `failed_to_show` with code `1`. See [The four hour window](fullscreen.md#the-four-hour-window).
|
|
228
|
+
|
|
229
|
+
## Mediation
|
|
230
|
+
|
|
231
|
+
Five optional complements carry AppLovin, Meta, InMobi, Unity and Liftoff dependencies on both platforms. Google Mobile Ads discovers their adapters; applications keep calling the core factories. ironSource mediation is deferred.
|
|
232
|
+
|
|
233
|
+
The provider availability probes and legacy consent setters from internal builds have been removed from `ti.admob.unified`. Use `getMediationStatus()` for Google-reported initialization diagnostics, then verify the packaged dependencies separately. Follow UMP and each provider's current consent requirements. Configure accounts, mappings and credentials in AdMob, then validate delivery with Ad Inspector.
|
|
234
|
+
|
|
235
|
+
An application that serves AdMob demand only leaves the complements out and uses `Admob.initialize({})`, with no disabling flag. Including selected complements opts into automatic adapter discovery; no `enableMediation` flag is needed. An exceptional session that skips installed adapters is covered in the [initialization reference](api-reference.md#automatic-adapter-discovery).
|
|
236
|
+
|
|
237
|
+
## Development checklist
|
|
238
|
+
|
|
239
|
+
- Use the module's `TEST_*` constants.
|
|
240
|
+
- Keep production IDs disabled until physical validation is complete.
|
|
241
|
+
- Test consent accepted, rejected, not required, and previous-session states.
|
|
242
|
+
- Test ATT authorized, denied, and previously resolved on iOS.
|
|
243
|
+
- Test banner load, error collapse, rotation, background/resume, and repeated window close.
|
|
244
|
+
- Test interstitial, rewarded, rewarded interstitial, and app open duplicate loads, show failures, close, reward delivery, and repeated destruction.
|
|
245
|
+
- Confirm no duplicate banners or retained listeners.
|
|
246
|
+
- Inspect requests with Ad Inspector.
|
|
247
|
+
- Inspect `getMediationStatus()` after `module_initialized`, and verify installed complements separately through package inventories and Ad Inspector.
|
|
248
|
+
- Run `npm test` and `./scripts/verify-artifacts.sh`.
|
|
249
|
+
|
|
250
|
+
|
|
251
|
+
## Corrections from internal audit builds
|
|
252
|
+
|
|
253
|
+
Boolean results and payload fields use JavaScript Booleans on both platforms; replace comparisons to numeric `0` or `1`. iOS load errors now use the shared error constants; presentation, UMP and Inspector codes remain domain-specific. Use the event name and the reference's error table when migrating code that compared raw NSError values.
|
|
254
|
+
|
|
255
|
+
Application volume now works on iOS using the same percentage string accepted on Android. Fullscreen configuration properties are mutable for subsequent loads on both platforms. Native helper/delegate methods and internal state from earlier iOS builds are no longer exposed as application APIs. The current generic diagnostic reports only the adapters known to Google; it does not return the old per-provider Boolean availability map.
|
|
256
|
+
|
|
257
|
+
## Earlier core-only startup settings
|
|
258
|
+
|
|
259
|
+
If an existing startup block passes `disableMediation: true`, remove that exception before using optional mediation complements. Google then initializes the adapters selected in tiapp.xml. Core-only apps need no mediation switch. Changing this option requires a new app session because the first initialization configuration wins.
|
|
@@ -0,0 +1,84 @@
|
|
|
1
|
+
> Source snapshot: official ti.admob.unified 1.0.0 documentation at release source commit `034843299b2984253988e0ffccb9f6a1c91682c9` (copied 2026-10-24). Relative links rebased for this skill.
|
|
2
|
+
|
|
3
|
+
# Changelog
|
|
4
|
+
|
|
5
|
+
## [1.0.0] - 2026-10-24
|
|
6
|
+
|
|
7
|
+
- Add a bounded iPad layout workaround for a collapsed Google Interstitial SVG. Eligibility follows the zero-width column-flex markup for both demo and publisher-owned units. It preserves proportions and stops with the presentation lifecycle. Production creative coverage remains unverified; see the fullscreen guide for its limits.
|
|
8
|
+
|
|
9
|
+
- Preserve ready fullscreen preloads across Android client-area changes after dismissal by comparing stable outer window bounds; retain invalidation for rotation and window resizing.
|
|
10
|
+
|
|
11
|
+
- Keep the example's session status panel fixed above the scrolling content, reserving its measured height and preserving the banner's separate space.
|
|
12
|
+
|
|
13
|
+
- Keep an explicit fullscreen Show/Retry request pending through loading or size replacement in the example, then present without a second tap. Cancel pending presentation when its foreground, privacy or window context ends.
|
|
14
|
+
|
|
15
|
+
- Add visible ATT status/query/request controls to the example, with current-state refresh after returning from Settings, visible feedback for repeated checks, an explanation for resolved permissions and explicit Android applicability.
|
|
16
|
+
|
|
17
|
+
- Explain AdMob’s rewarded interstitial introduction requirements in the demo card, with an official policy link. Show opens a reward introduction with Watch test ad and Skip; Skip cancels that presentation. After Watch, a needed reload completes and presents without another Show tap. Clarify ATT configuration when AdMob UMP presents the IDFA message.
|
|
18
|
+
|
|
19
|
+
- Add `getTrackingAuthorizationStatus()` on iOS and Android for a current ATT snapshot without prompting or starting ads. Clarify ATT startup order, localization and store disclosures.
|
|
20
|
+
|
|
21
|
+
- Added `createRewardedInterstitial()` on iOS and Android, with shared fullscreen events, SDK-earned rewards, terminal cleanup and a matching integration-library manager. The demo introduces the reward and allows skipping before presentation.
|
|
22
|
+
|
|
23
|
+
First public release. Earlier development snapshots were not published releases.
|
|
24
|
+
|
|
25
|
+
### Integration and reliability
|
|
26
|
+
|
|
27
|
+
- Normalize iOS load errors to the shared constants and return actual Booleans through the bridge.
|
|
28
|
+
- Implement percentage-based application volume on iOS and validate the same range on Android.
|
|
29
|
+
- Hide accidental iOS state/helper exports while preserving native delegates and lifecycle callbacks.
|
|
30
|
+
- Expose fullscreen configuration properties on Android and retain primitive extras; defer banner reconfiguration to its next load.
|
|
31
|
+
- Allow consent retries after failures, refresh cached results after privacy options, and serialize reset with outstanding UMP work.
|
|
32
|
+
- Read Android's standard IAB preferences and restrict mediation availability to installed adapters.
|
|
33
|
+
- Capture the presented rewarded ad's reward independently of dismissal/reload; serialize fullscreen SDK operations on the UI thread.
|
|
34
|
+
- Remove targeting values and test-device IDs from module-owned debug messages.
|
|
35
|
+
- Fix library callback reentrancy, share concurrent privacy/Inspector operations, and wait for iOS adaptive layout.
|
|
36
|
+
- Keep banner-button feedback in the button with light-green styling; reuse the current banner on reload without collapsing its slot.
|
|
37
|
+
- Keep ads and listeners through an Android light/dark switch: the example and the cleanup guide ignore the `close` event Titanium fires while it recreates the activity.
|
|
38
|
+
- Check fullscreen request dimensions at Show in the library and playground; reload only the selected stale ad, without rotation listeners or timers.
|
|
39
|
+
- Accept iOS UMP UUID test identifiers and support per-platform consent test defaults in the example application's properties.
|
|
40
|
+
|
|
41
|
+
|
|
42
|
+
### Documentation
|
|
43
|
+
|
|
44
|
+
- Add production integration guidance for archive installation, Alloy/Classic imports, privacy, store disclosures, app verification and troubleshooting.
|
|
45
|
+
- Separate fullscreen load and show examples, make the optional ATT startup path explicit, and reconcile consent retries, banner reconfiguration and app-open expiry documentation with both native implementations.
|
|
46
|
+
- Document API limits and preserve known iOS runtime issues in release readiness.
|
|
47
|
+
- Include README screenshots in offline release archives and verify their packaged contents.
|
|
48
|
+
|
|
49
|
+
### Dependency refresh
|
|
50
|
+
|
|
51
|
+
- Include Unity Ads SDK 4.21.0 explicitly on Android; the adapter POM does not supply it.
|
|
52
|
+
- Update UnityCoherenceLib to 0.2.0 with Unity Ads 4.21.0.
|
|
53
|
+
- Retain Meta SDK 6.22.0 and InMobi Android SDK 11.5.0 as required by their latest published adapters, despite newer standalone SDKs.
|
|
54
|
+
|
|
55
|
+
- Update Google Mobile Ads to iOS 13.11.0 and Android 25.5.0; UMP remains at iOS 3.1.0 and Android 4.0.0.
|
|
56
|
+
- Refresh InMobi, Unity and Liftoff to the compatible published versions checked October 23, 2026; AppLovin and Meta adapters remain current. See [Dependencies](dependencies.md).
|
|
57
|
+
- Remove IronSourceAdQualitySDK from Unity: Unity Ads 4.21.0 no longer depends on it.
|
|
58
|
+
- Require Titanium SDK 13.4.1.GA for the core and every optional complement, matching the build toolchain and Android compile SDK 36.
|
|
59
|
+
- Pin Guava 33.7.2-android in the core plus OkHttp 5.4.0 and Okio 3.18.2 in InMobi/Liftoff/Unity to replace the Guava, OkHttp and Okio versions flagged in the security review.
|
|
60
|
+
- Retain the version contract test: Meta now matches across platforms; Liftoff retains the documented SDK difference.
|
|
61
|
+
|
|
62
|
+
### Unified core
|
|
63
|
+
|
|
64
|
+
- Run Android SDK configuration and initialization off the UI thread; preserve idempotency and deliver success/failure on the UI thread.
|
|
65
|
+
|
|
66
|
+
- One iOS/Android JavaScript API for standard/adaptive banners, interstitials, rewarded ads, rewarded interstitials and app open ads.
|
|
67
|
+
- Consent-first UMP flow, portable ATT completion and Ad Inspector support.
|
|
68
|
+
- Idempotent initialization, serialized loads and deterministic cleanup.
|
|
69
|
+
- Google Mobile Ads and UMP only; no third-party network adapters in the core.
|
|
70
|
+
- The examples use only the core without a mediation flag. Google Mobile Ads automatically discovers adapters supplied by selected complements; `disableMediation: true` remains an explicit session exception.
|
|
71
|
+
|
|
72
|
+
### Optional mediation
|
|
73
|
+
|
|
74
|
+
- Five independent dependency modules: `ti.admob.unified.mediation.applovin`, `.meta`, `.inmobi`, `.unity` and `.liftoff`, each on Android and iOS at `1.0.0`.
|
|
75
|
+
- Each Android complement declares its adapter Maven coordinate, any required explicit SDK dependency, and documented utility overrides. Each iOS complement vendors only its own adapter, SDK and required resources/dependencies.
|
|
76
|
+
- Unity includes UnityAdapter, UnityAds and UnityCoherenceLib. Its updated SDK no longer requires IronSourceAdQualitySDK.
|
|
77
|
+
- ironSource mediation is deferred; IronSourceAdapter and IronSource are not distributed.
|
|
78
|
+
- SDKs and adapters were updated to the compatible October 23, 2026 versions; framework checksums were regenerated. See [Dependencies](dependencies.md).
|
|
79
|
+
- `getMediationStatus()` returns generic Google initialization diagnostics; pre-release provider probes and no-op consent setters were removed. `disableMediation` remains a global startup control.
|
|
80
|
+
- Release artifacts are discovered from complement folders and manifests; packaged dependencies are checked against literal Gradle declarations without a provider list. Nothing is published or tagged by the build scripts.
|
|
81
|
+
|
|
82
|
+
### Validation
|
|
83
|
+
|
|
84
|
+
Packaging/linking and Google test-ad loading are separate from third-party ad delivery. Provider delivery requires configured accounts, mappings and Ad Inspector evidence; it is not established by a successful build or a Google test ad. See [release validation](mediation.md#release-validation).
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
MIT License
|
|
2
|
+
|
|
3
|
+
Copyright (c) 2026 César Estrada
|
|
4
|
+
|
|
5
|
+
Permission is hereby granted, free of charge, to any person obtaining a copy
|
|
6
|
+
of this software and associated documentation files (the "Software"), to deal
|
|
7
|
+
in the Software without restriction, including without limitation the rights
|
|
8
|
+
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
|
9
|
+
copies of the Software, and to permit persons to whom the Software is
|
|
10
|
+
furnished to do so, subject to the following conditions:
|
|
11
|
+
|
|
12
|
+
The above copyright notice and this permission notice shall be included in all
|
|
13
|
+
copies or substantial portions of the Software.
|
|
14
|
+
|
|
15
|
+
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
|
16
|
+
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
|
17
|
+
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
|
18
|
+
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
|
19
|
+
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
|
20
|
+
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
|
21
|
+
SOFTWARE.
|